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()
に、画像をロードして画像フォーマットを自動認識させる方法を知っている人はいますか?