Delphi 的 DBImage 只支持 BMP 格式的图片。如果在数据库的 Blob 字段里面存储 BMP 图片,则 DBImage 可以自动显示图片。如果在 Blob 字段里面存储 Jpg 图片,则打开数据库的时候,如果绑定了一个 DBImage 到该字段,会报异常。
要让 DBImage 支持 JPEG,其核心是:TWICImage.
TWICImage 是 Delphi 10 以来新增加的一个类,在 Vcl.Graphics; 单元里面。这个类支持各种图片格式,包括 gif, png, jpg 等等。
Danny Wind 有两篇文章和一个 Demo 代码演示了如何使用 TWICImage 来达到让 Image 显示 JPG 图片的效果:
---------------
核心代码:
{Display info from image inside Blob}
procedure TFormMain.DisplayPictureInfo(Field: TBlobField);
var
lWICImage: TWICImage;
begin
MemoMain.Lines.Add('======================');
if (Field.BlobSize > 0) then
begin {Assume image}
lWICImage := TWICImage.Create;
try
lWICImage.Assign(Field);
MemoMain.Lines.Add('Picture inside BlobField:');
MemoMain.Lines.Add('Size = ' + Field.BlobSize.ToString + ' bytes');
MemoMain.Lines.Add('Format = ' + GetEnumName(TypeInfo(TWICImageFormat),Integer(lWICImage.ImageFormat)));
finally
lWICImage.Free;
end;
end
else {Empty}
begin
MemoMain.Lines.Add('No picture, Blob is Empty');
MemoMain.Lines.Add('Click on image to add a picture.');
end;
end;
{TWICImage can determine image type from the header that was saved into the Blob.
Note: TWICImage requires WIndows-XP SP3 and Delphi-2010.}
procedure TFormMain.LoadPictureFromField(Field: TBlobField; Picture: TPicture);
var
lWICImage: TWICImage;
begin
if (Field.BlobSize > 0) then
begin {Assume image}
lWICImage := TWICImage.Create;
try
lWICImage.Assign(Field);
Picture.Assign(lWICImage);
finally
lWICImage.Free;
end;
end
else {Empty}
begin
Picture.Assign(nil);
end;
end;
上述函数的 Picture 来自一个 Image。因此就可以在一个 TImage 里面显示来自数据库字段的图片了。要让它自动显示,在 DataSource.OnDataChange 事件里面调用这个方法。