Что использовать для отображения картинок в Делфи, которые были сохранены
в БД ms Access как поле объекта OLE.
При использовании dbImage возникает ошибка.
И как в mdb можно хранить картинки.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
Смещение 82 байта бывает тогда, когда картинки засовывались в руссифицированной Винде. Если есть возможность, что картинки в базу будут добавляться в разных Виндах, то надо сначала это проверять.
Типа так:
Dump:Array[0..12] of Char;
BlbStr:=TBlobStream(dtmData.adtViewSchemes.CreateBlobStream(dtmData.adtViewSchemes.FieldByName('Рисунок'), bmRead));
BlbStr.Seek($14,soFromBeginning);
BlbStr.Read(Dump,12);
sDump:=StrPas(Dump);
If sDump='Bitmap Image' then
BlbStr.Seek(78,soFromBeginning)
Else
BlbStr.Seek(82,soFromBeginning);
82 байта потому, что у тебя картинки засовывались в базу в русской Windows. В английской это смещение составляет 78 байт. Поэтому сначала проверяй, что записанно в первых байтах. Типа так:
BlbStr:=TBlobStream(dtmData.adtViewSchemes.CreateBlobStream(dtmData.adtViewSchemes.FieldByName('Рисунок'), bmRead));
BlbStr.Seek($14,soFromBeginning);
BlbStr.Read(Dump,12);
sDump:=StrPas(Dump);
If sDump='Bitmap Image' then
BlbStr.Seek(78,soFromBeginning)
Else
BlbStr.Seek(82,soFromBeginning);
Знакомая проблема...
Она заключается в том, что BLOB-поля хранятся не в исходном виде, а как OLE-объекты с заголовками памяти OLE в начале реальных графических данных. Этот заголовок составляет 78 байтов. Чтобы при использовании объектов TBitmap не получать сообщения "Bitmap Image is not valid", можно поступить следующим образом:
var
bitmap:TBitmap;
bs:TADOBlobStream;
begin
try
bs:=TADOBlobStream.Create(ADOTable1photo,bmRead);
bs.Seek(78,soFromBeginning);
bitmap:=TBitmap.Create;
bitmap.LoadFromStream(bs);
DBImage1.Picture.Graphic:=bitmap;
finally
bitmap.Free;
bs.Free;
end;
end;
Данный код необходимо поместить в обработчик события AfterScroll компонента, используемого для доступа к графической информации в таблице.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.