Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как правильно сохранять и восстанавливать изображения различніх типов в BLOB / 8 сообщений из 8, страница 1 из 1
09.01.2004, 23:41
    #32372079
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
С BMP нет проблем, а вот при восстановлении не bmp (jpg) из блоб ругается

Image1.Picture:=nil;
Image1.Assign(TBlobField(DataModule1.PeopleDoc.FieldByName('DOC'+IntToStr(NomDoc))));
Image1.Update;
...
Рейтинг: 0 / 0
10.01.2004, 12:42
    #32372158
Roman Ignatiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
Почему-то мне кажется, что вопрос не в этот форум. Могу подсказать. Сразу скажу, что 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
10.01.2004, 12:55
    #32372165
Roman Ignatiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
Млин...
Код: 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
10.01.2004, 14:08
    #32372189
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
Премного благодарен! Работает, как надо, правда только с bmp и jpg.
А как насчет gif, ico, других (нужно еще хотя бы gif)
...
Рейтинг: 0 / 0
10.01.2004, 14:18
    #32372194
Roman Ignatiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
В чем проблема? У каждого графического файла есть сигнатура. Подшей определение в GetStreamImgType и возвращай нужный тип
...
Рейтинг: 0 / 0
10.01.2004, 14:23
    #32372197
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
Я так и делаю:
Только не пойму, что с 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
10.01.2004, 14:30
    #32372202
Roman Ignatiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
Хе. Для этого сначала нужно найти модуль, реализующий работу с gif, аналогично Jpeg, присоединить его, ну и писать тот тип, который в нем есть. А исходно в Dephi работы с гифами нет.
...
Рейтинг: 0 / 0
10.01.2004, 14:42
    #32372213
Как правильно сохранять и восстанавливать изображения различніх типов в BLOB
Нашел. За GIF отвечает RxGif
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как правильно сохранять и восстанавливать изображения различніх типов в BLOB / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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