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 が報告されます。たとえば、長さ 0 のファイルを にロードしようとするとTJPEGImage、エラー 42 が最終結果になります。

すべてではなく一部の画像が表示される場合、最も可能性の高い説明は、データが何らかの形で DB への往復を行っていないことです。

書き出すときは、BLOB フィールドのサイズを確認してください。ディスクファイルに書き込むときに、ファイルのサイズと一致することを確認してください。ディスク ファイルが有効な JPEG であることを確認します。次に、BLOB フィールドを再度読み取ったときに、その長さがまったく同じであることを確認します。おそらく、DB コードに何か問題があり、ストリームが切り詰められています。

したがって、ここでの最初のステップは、最初に DB に入れたデータとまったく同じデータを復元できることを確認することです。

私が持っている他の唯一の考えは、画像コントロールのグラフィックが常にJPEGであるとは限らないということです. 画像の読み込みに使用するコードImage1.Picture.Graphic.LoadFromStream()は、データが JPEG であることを前提としています。JPEG 以外のものを保存した場合、LoadFromStream()失敗します。

于 2012-10-02T20:30:26.673 に答える