gpt4 book ai didi

delphi - TBitmap32.LoadFromStream() 自动识别图像格式

转载 作者:行者123 更新时间:2023-12-03 15:22:13 25 4
gpt4 key购买 nike

我正在使用 Delphi XE2(更新 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() 代码并取消注释前两行,它就会起作用 - 因此它能够在从文件加载图像时确定图像格式。在此示例中,bs 包含有效的 PNG 图像。但是,有时它可能是 GIF、JPG、BMP 或其他图形格式。

我还知道我可以使用中间对象(例如,TPNGImageTJPEGImage等),使用LoadFromStream() 到中间对象,然后 Assign() 将其分配给 TBitmap32。但是,如果 TBitmap32 可以在没有中间对象的情况下处理任何类型的图像,那就更好了,我认为它可以......

问题

有谁知道如何使用TBitmap32.LoadFromStream()加载图像并让它自动识别图像格式而不将图像保存到HDD(甚至暂时),或使用中间对象?

最佳答案

Delphi XE2 在 Vcl.Graphics 中包含一个名为 TWICImage 的类,它处理 Windows Imaging Component 支持的图像。 ,包括BMP、GIF、ICO、JPEG、PNG、TIF 和 Windows Media Photo。这意味着您可以直接从流加载任何支持的图像类型,它将自动检测图像类型并加载它。然后可以将加载的图像分配给 TBitmap32 组件(或 TImageTImage32 等)。

uses GR32, Vcl.Graphics;

var
pic: TBitmap32;
wic: TWICImage;
bs: TBytesStream;
begin
bs := TBytesStream.Create(TClientDataSet(cds).FieldByName('filedata').AsBytes);
try
pic := TBitmap32.Create;
try
wic := TWICImage.Create;
try
bs.Position := 0;
wic.LoadFromStream(bs);
pic.Assign(wic);
finally
FreeAndNil(wic);
end;
finally
FreeAndNil(pic);
end;
finally
FreeAndNil(bs);
end;
end;

无需在 uses 语句中添加 PNGImageGIFImgJPEG 即可使用。

关于delphi - TBitmap32.LoadFromStream() 自动识别图像格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17208785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com