TDBImage + JPEG

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

TDBImage + JPEG

Сообщение Insaned » 01.10.2009 10:47:57

Есть FireBird база. В ней блобы, в блобах джипеги.
Хочется отображать джипеги на форме с помощью компонента TDBImage, однако когда я пытаюсь это сделать - программа вываливается с эксепшеном. Документация по TDBImage, как и по всему лазарусу - хромает на обе ноги, но я интуитивно догадываюсь, что TDBImage не умеет отображать джипег, а умеет отображать только битмап. Хранить битмапы в базе, конечно оригинально, но не хотелось бы. Читать блоб в поток, а потом в обычный Timage, наверное можно, но я не осилил.
У гугла спрашивал - не помогло.
Наверняка я не первый кто столкнулся с подобной проблеммой, возможно есть какие-то примеры, компоненты, модули...
Спасибо.
Insaned
незнакомец
 
Сообщения: 9
Зарегистрирован: 05.08.2009 13:46:22

Re: TDBImage + JPEG

Сообщение v-t-l » 01.10.2009 11:21:10

Insaned писал(а):Читать блоб в поток, а потом в обычный Timage, наверное можно, но я не осилил.

http://www.freepascal.ru/forum/viewtopic.php?t=4921&view=unread#p34789
возможно понадобиться после CreateBlobStream сделать Seek на начало джипега.
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: TDBImage + JPEG

Сообщение Insaned » 01.10.2009 14:58:16

Не получается.

Добавлено спустя 11 минут 4 секунды:
Текущее состояние вот такое:
Код: Выделить всё
    b:=TMemoryStream.Create;
    zquery1PHOTO1.SaveToStream(b);
    image1.Picture.LoadFromStreamWithFileExt(b,'.jpg');
    b.Destroy;


Ошибки не выдаются, но и в image тоже ничего не появляется.
Insaned
незнакомец
 
Сообщения: 9
Зарегистрирован: 05.08.2009 13:46:22

Re: TDBImage + JPEG

Сообщение Mr.Smart » 01.10.2009 15:21:11

Insaned
Вам же написали:
v-t-l писал(а):... сделать Seek на начало джипега.

Добавьте перед загрузкой из потока:
Код: Выделить всё
...
  b.Seek(0,0);
...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: TDBImage + JPEG

Сообщение Insaned » 01.10.2009 15:26:00

да. уже допер. спасибо.
всё получилось. вот полностью работающий кусок:
Код: Выделить всё
procedure Ttovar.ZQuery1AfterScroll(DataSet: TDataSet);
var
  b:TMemoryStream;
  MyJPEG : TJPEGImage;

begin
  if zquery1.FieldByName('PHOTO1').AsVariant <> null then
  begin
    b:=TMemoryStream.Create;
    zquery1PHOTO1.SaveToStream(b);
    b.Position:=0;
    image1.Picture.LoadFromStreamWithFileExt(b,'.jpg');
    b.Destroy;
  end
  else
  image1.Picture.Clear;

end;     
Insaned
незнакомец
 
Сообщения: 9
Зарегистрирован: 05.08.2009 13:46:22

Re: TDBImage + JPEG

Сообщение v-t-l » 01.10.2009 15:54:17

v-t-l писал(а):возможно понадобиться после CreateBlobStream сделать Seek на начало джипега.

Я имел в виду, что возможно джипег находится не в начале блоба.
Но похоже, что можно обойтись без лишних движений:
Код: Выделить всё
procedure Ttovar.ZQuery1AfterScroll(DataSet: TDataSet);
var
  b:TStream;

begin
  if not zquery1.FieldByName('PHOTO1').IsNull then
  begin
    b:=zquery1.CreateBlobStream(zquery1.FieldByName('PHOTO1'), bmRead);
    image1.Picture.LoadFromStreamWithFileExt(b,'.jpg');
    b.Free;
  end
  else
  image1.Picture.Clear;

end;


Добавлено спустя 4 минуты 55 секунд:
поправил код слегка :)

Добавлено спустя 36 минут 44 секунды:
Разобрался, в чем проблема с TDBimage. Он вначале пытается прочитать FileExt из блоба как AnsiString, а потом уже читает непосредственно картинку по формату в соответствии с прочитанной строчкой.
Это не есть карашо. Правильнее было бы или распознавать формат по сигнатуре самой картинки или хотя бы ввести дополнительное свойство
Код: Выделить всё
DefaultPictureFormat: AnsiString
в котором можно было бы написать '.jpg', '.bmp' и т.п.

Добавлено спустя 17 часов 55 минут 30 секунд:
Оказывается, народ в курсе. :) Даже патч прислали, только его еще не включили.
http://bugs.freepascal.org/view.php?id=14698
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 40

Рейтинг@Mail.ru