5

我在使用 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 错误 #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;

有人可以告诉我如何解决这个问题。谢谢你。

4

1 回答 1

8

截断流时报 JPEG 错误 42。例如,如果您尝试将零长度文件加载到 a中,TJPEGImage则错误 42 是最终结果。

如果显示了一些图像,但不是全部,那么最可能的解释是数据无法以某种方式往返于数据库并返回。

写出时检查 BLOB 字段的大小。当您将文件写入磁盘文件时,请检查它是否与文件的大小相符。检查磁盘文件是否为有效的 JPEG。然后确认 BLOB 字段在重新读取时具有完全相同的长度。也许您的数据库代码有问题并且流被截断。

因此,这里的第一步是确认您可以恢复您最初放入数据库的完全相同的数据。

我唯一的另一个想法是图像控件中的图形并不总是JPEG。用于加载图像的代码Image1.Picture.Graphic.LoadFromStream()假定数据是 JPEG。如果您保存了 JPEG 以外的其他内容,那么LoadFromStream()将会失败。

于 2012-10-02T20:30:26.673 回答