我目前正在尝试从具有 OLE 对象字段并包含有效位图的 MS Access 数据库中读取图像(出于测试目的,我使用 MS Paint 创建了图像并将其保存为 24 位 bmp)。
我通过 DBGrid 链接到这个。从理论上讲,一切都应该正常工作并且应该显示图像,但是我得到一个:“位图图像无效”错误。如果这是 JPEG 而不是 .bmp,我可以理解,但事实并非如此。所以我的问题是,有什么问题?
我不一定必须使用 DBImage,普通的 TImage 也可以很好(甚至可能更可取),但我不确定如何将 TImage 分配给 MS Access 数据库中的 OLE 对象字段。我试过了,无济于事:
//Select photo from Image field
Image1.Picture := ADOTable1['Image'];
我已经阅读了关于这个问题的大部分文章,例如 about.com 等,但仍然没有得到任何好的结果。
任何帮助将不胜感激!
更新:这对我有用:
添加到USES子句:JPEG、ADODB、DB
function JpegStartsInBlob
(PicField:TBlobField):integer;
var
bS : TADOBlobStream;
buffer : Word;
hx : string;
begin
Result := -1;
bS := TADOBlobStream.Create(PicField, bmRead);
try
while (Result = -1) and
(bS.Position + 1 < bS.Size) do
begin
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'FF' then begin
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'D8' then Result := bS.Position - 2
else if hx = 'FF' then
bS.Position := bS.Position-1;
end;
end;
finally
bS.Free
end;
end;
procedure TfrmOne.btnShowImageClick(Sender: TObject);
var
bS : TADOBlobStream;
Pic : TJPEGImage;
begin
bS := TADOBlobStream.Create(table1.FieldByName('Photo') as TBlobField, bmRead);
bS.Seek(JpegStartsInBlob(table1.FieldByName('Photo') as TBlobField),
soFromBeginning);
Pic := TJPEGImage.Create;
Pic.LoadFromStream(bS);
frmOne.Image1.Picture.Graphic := Pic;
Pic.Free;
bS.Free;
end;