Есть FireBird база. В ней блобы, в блобах джипеги.
Хочется отображать джипеги на форме с помощью компонента TDBImage, однако когда я пытаюсь это сделать - программа вываливается с эксепшеном. Документация по TDBImage, как и по всему лазарусу - хромает на обе ноги, но я интуитивно догадываюсь, что TDBImage не умеет отображать джипег, а умеет отображать только битмап. Хранить битмапы в базе, конечно оригинально, но не хотелось бы. Читать блоб в поток, а потом в обычный Timage, наверное можно, но я не осилил.
У гугла спрашивал - не помогло.
Наверняка я не первый кто столкнулся с подобной проблеммой, возможно есть какие-то примеры, компоненты, модули...
Спасибо.
TDBImage + JPEG
Модератор: Модераторы
Insaned писал(а):Читать блоб в поток, а потом в обычный Timage, наверное можно, но я не осилил.
http://www.freepascal.ru/forum/viewtopic.php?t=4921&view=unread#p34789
возможно понадобиться после CreateBlobStream сделать Seek на начало джипега.
Не получается.
Добавлено спустя 11 минут 4 секунды:
Текущее состояние вот такое:
Ошибки не выдаются, но и в image тоже ничего не появляется.
Добавлено спустя 11 минут 4 секунды:
Текущее состояние вот такое:
Код: Выделить всё
b:=TMemoryStream.Create;
zquery1PHOTO1.SaveToStream(b);
image1.Picture.LoadFromStreamWithFileExt(b,'.jpg');
b.Destroy;
Ошибки не выдаются, но и в image тоже ничего не появляется.
Insaned
Вам же написали:
Добавьте перед загрузкой из потока:
Вам же написали:
v-t-l писал(а):... сделать Seek на начало джипега.
Добавьте перед загрузкой из потока:
Код: Выделить всё
...
b.Seek(0,0);
...
да. уже допер. спасибо.
всё получилось. вот полностью работающий кусок:
всё получилось. вот полностью работающий кусок:
Код: Выделить всё
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;
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Добавлено спустя 17 часов 55 минут 30 секунд:
Оказывается, народ в курсе.
http://bugs.freepascal.org/view.php?id=14698
