我有问题使用Delphi从我的MySql数据库在TImage中显示我的图片。
我使用此代码将图片保存到我的数据库并完美地工作。
var
AStream : TMemoryStream;
AStream := TMemoryStream.Create;
try
Image1.Picture.Graphic.SaveToStream(AStream);
AStream.Position := 0;
if ADODataSet1.Active then
begin
ADODataSet1.Edit;
TBlobField(ADODataSet1.FieldByName('MyField')).LoadFromStream(AStream);
ADODataSet1.Post;
end;
finally
AStream.Free;
end;
但是,问题是当我想要检索那些图片时。我使用此代码,但我只能显示数据库中的第一个图像。我在DBGrid事件上使用此代码 - OnDrawColumnCell。当我使用这个代码时,我正在收到JPEG#ERROR#42的消息!
var
AStream : TMemoryStream;
begin
AStream := TMemoryStream.Create;
try
if ADODataSet1.Active then
begin
TBlobField(ADODataSet1.FieldByName('MyField')).SaveToStream(AStream);
AStream.Position := 0;
Image1.Picture.Graphic.LoadFromStream(AStream);
end;
finally
AStream.Free;
end;
end;
有人可以告诉我如何解决这个问题。 谢谢。
答案 0 :(得分:7)
截断流时报告JPEG错误42。例如,如果您尝试将零长度文件加载到TJPEGImage
,则错误42是最终结果。
如果显示某些图像,但不是全部图像,则最可能的解释是数据在某种程度上不会使数据包往返并返回。
写出时检查BLOB字段的大小。将其写入磁盘文件时,请检查它是否与文件大小相符。检查磁盘文件是否是有效的JPEG。然后在重新读取时确认BLOB字段具有完全相同的长度。也许你的数据库代码出了问题,流被截断了。
因此,这里的第一步是确认您可以恢复最初放入数据库的完全相同的数据。
我唯一的另一个想法是图像控件中的图形并不总是JPEG。用于加载图像的代码Image1.Picture.Graphic.LoadFromStream()
假定数据是JPEG。如果您保存了除JPEG之外的其他内容,则LoadFromStream()
将失败。