I'm using Delphi XE2 (Update 3) and GR32. I am unable to use TBitmap32.LoadFromStream()
to load the image data. It raises the following exception:
Project MyApp.exe raised exception class EInvalidGraphic with message 'Bitmap image is not valid'.
Code
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;
Workaround(s)
If I comment the LoadFromStream()
code and uncomment the prior two lines, it works -- so it is able to determine the image format when loading it from a file. In this example, bs
contains a valid PNG image. However, sometimes it may be a GIF, JPG, BMP or another graphic format.
I also know that I can use an intermediate object (e.g., TPNGImage
, TJPEGImage
, etc.), load the image data using LoadFromStream()
into the intermediate object, and then Assign()
it to the TBitmap32
. However, it would be better if TBitmap32
could handle any type of image without an intermediate object, which I thought it could...
Question
Does anyone know how to use TBitmap32.LoadFromStream()
to load the image and have it auto-recognize the image format without saving the image to the HDD (even temporarily), or using an intermediate object?