5

Delphi XE2 (Update 3) と GR32 を使用しています。TBitmap32.LoadFromStream()画像データの読み込みに使用できません。次の例外が発生します。

Project MyApp.exe raised exception class EInvalidGraphic with message 'Bitmap image is not valid'.

コード

uses GR32, GifImg, PngImage, Vcl.Graphics;

var
  pic: TBitmap32;
  bs: TBytesStream;
begin
  bs := TBytesStream.Create(TClientDataSet(cds).FieldByName('filedata').AsBytes);
  try
    pic := TBitmap32.Create;
    try
//      bs.SaveToFile('c:\delme.png');
//      pic.LoadFromFile('c:\delme.png');
      pic.LoadFromStream(bs); // <- EInvalidGraphic exception
      // do something with 'pic'
    finally
      FreeAndNil(pic);
    end;
  finally
    FreeAndNil(bs);
  end;
end;

回避策

コードにコメントを付けLoadFromStream()、前の 2 行のコメントを外すと、動作します。そのため、ファイルからイメージをロードするときにイメージ フォーマットを判別できます。この例でbsは、有効な PNG イメージが含まれています。ただし、GIF、JPG、BMP、またはその他のグラフィック形式の場合もあります。

TPNGImageまた、中間オブジェクト (例: 、TJPEGImageなど) を使用し、使用して画像データをLoadFromStream()中間オブジェクトにロードし、Assign()それをにロードできることも知っていTBitmap32ます。ただし、中間オブジェクトなしで任意のタイプの画像を処理できれば、それがTBitmap32可能だと思いました...

質問

画像をHDDに保存せずに(一時的であっても)、または中間オブジェクトを使用せずTBitmap32.LoadFromStream()に、画像をロードして画像フォーマットを自動認識させる方法を知っている人はいますか?

4

2 に答える 2