powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
8 сообщений из 8, страница 1 из 1
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
    #32372079
С BMP нет проблем, а вот при восстановлении не bmp (jpg) из блоб ругается

Image1.Picture:=nil;
Image1.Assign(TBlobField(DataModule1.PeopleDoc.FieldByName('DOC'+IntToStr(NomDoc))));
Image1.Update;
...
Рейтинг: 0 / 0
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
    #32372158
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то мне кажется, что вопрос не в этот форум. Могу подсказать. Сразу скажу, что GetStreamImgType написана плохо, но это рабочий вариант.

uses Graphics, Jpeg; //как минимум :)

function GetStreamImgType(Stream: TStream): TClass;
var
StreamPos: int64;
ImgSign: string;
begin
StreamPos := Stream.Position;
try
//BMP если не определено
Result := Graphics.TBitmap;
//JPEG
SetLength(ImgSign, 4);
Stream.Seek(6, soFromCurrent);
Stream.Read(ImgSign[1],4);
if (UpperCase(ImgSign) = 'JFIF') or (UpperCase(ImgSign) = 'EXIF') then
Result := Jpeg.TJPEGImage;
//WMF
Stream.Position := StreamPos;
SetLength(ImgSign, 4);
Stream.Read(ImgSign[1],4);
if ImgSign = #$D7#$CD#$C6#$9A then
Result := Graphics.TMetafile;
finally
Stream.Position := StreamPos;
end;
end;

procedure LoadProperImage(Stream: TStream; Picture: TPicture);
var
Img: TGraphic;
StreamPos: int64;
begin
StreamPos := Stream.Position;
Img := TGraphicClass(GetStreamImgType(Stream)).Create;
try
Stream.Position := StreamPos;
Img.LoadFromStream(Stream);
Picture.Graphic := Img;
finally
Img.Free;
end;
end;

function LoadPictureFromBLOB(Picture: TPicture; Field: TBlobField): boolean;
var
Stream: TStream;
begin
Result := False;
if not Field.isNULL then
begin
Stream := TMemoryStream.Create;
try
Field.SaveToStream(Stream);
Stream.Position := 0;
LoadProperImage(Stream, Picture);
Result := True;
finally
Stream.Free;
end;
end;
end;

procedure SavePictureToBlob(Picture: TPicture; Field: TBlobField);
var
Stream: TStream;
begin
if not (Field.DataSet.State in [dsEdit, dsInsert]) then
Field.DataSet.Edit;
Field.Clear;
if Assigned(Picture.Graphic) then
if not Picture.Graphic.Empty then
begin
Stream := TMemoryStream.Create;
try
Picture.Graphic.SaveToStream(Stream);
Stream.Position := 0;
Field.LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
end;
...
Рейтинг: 0 / 0
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
    #32372165
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Млин...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
function GetStreamImgType(Stream: TStream): TClass;
var
  StreamPos: int64;
  ImgSign: string;
begin
  StreamPos := Stream.Position;
  try
    //BMP если не определено
    Result := Graphics.TBitmap;
    //JPEG
    SetLength(ImgSign,  4 );
    Stream.Seek( 6 , soFromCurrent);
    Stream.Read(ImgSign[ 1 ], 4 );
    if (UpperCase(ImgSign) = 'JFIF') or (UpperCase(ImgSign) = 'EXIF') then
      Result := Jpeg.TJPEGImage;
    //WMF
    Stream.Position := StreamPos;
    SetLength(ImgSign,  4 );
    Stream.Read(ImgSign[ 1 ], 4 );
    if ImgSign = #$D7#$CD#$C6#$9A then
      Result := Graphics.TMetafile;
  finally
    Stream.Position := StreamPos;
  end;
end;

procedure LoadProperImage(Stream: TStream; Picture: TPicture);
var
  Img: TGraphic;
  StreamPos: int64;
begin
  StreamPos := Stream.Position;
  Img := TGraphicClass(GetStreamImgType(Stream)).Create;
  try
    Stream.Position := StreamPos;
    Img.LoadFromStream(Stream);
    Picture.Graphic := Img;
  finally
    Img.Free;
  end;
end;

function LoadPictureFromBLOB(Picture: TPicture; Field: TBlobField): boolean;
var
  Stream: TStream;
begin
  Result := False;
  if not Field.isNULL then
  begin
    Stream := TMemoryStream.Create;
    try
      Field.SaveToStream(Stream);
      Stream.Position :=  0 ;
      LoadProperImage(Stream, Picture);
      Result := True;
    finally
      Stream.Free;
    end;
  end;
end;

procedure SavePictureToBlob(Picture: TPicture; Field: TBlobField);
var
  Stream: TStream;
begin
  if not (Field.DataSet.State in [dsEdit, dsInsert]) then
    Field.DataSet.Edit;
  Field.Clear;
  if Assigned(Picture.Graphic) then
    if not Picture.Graphic.Empty then
      begin
        Stream := TMemoryStream.Create;
        try
          Picture.Graphic.SaveToStream(Stream);
          Stream.Position :=  0 ;
          Field.LoadFromStream(Stream);
        finally
          Stream.Free;
        end;
      end;
end;
...
Рейтинг: 0 / 0
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
    #32372189
Премного благодарен! Работает, как надо, правда только с bmp и jpg.
А как насчет gif, ico, других (нужно еще хотя бы gif)
...
Рейтинг: 0 / 0
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
    #32372194
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чем проблема? У каждого графического файла есть сигнатура. Подшей определение в GetStreamImgType и возвращай нужный тип
...
Рейтинг: 0 / 0
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
    #32372197
Я так и делаю:
Только не пойму, что с GIF8 писать:
...
//WMF
Stream.Position := StreamPos;
SetLength(ImgSign, 4);
Stream.Read(ImgSign[1],4);
if (ImgSign = #$D7#$CD#$C6#$9A) then
Result := Graphics.TMetafile
else if UpperCase(ImgSign) = 'GIF8' then
//что тут
//Result := ???

...
...
Рейтинг: 0 / 0
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
    #32372202
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хе. Для этого сначала нужно найти модуль, реализующий работу с gif, аналогично Jpeg, присоединить его, ну и писать тот тип, который в нем есть. А исходно в Dephi работы с гифами нет.
...
Рейтинг: 0 / 0
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
    #32372213
Нашел. За GIF отвечает RxGif
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]