如何将FMX.TImage赋值给VCL.TBitmap?

How to assign s a FMX.TImage to a VCL.TBitmap?

我尝试这样做:

BMP.Assign(Image1.Bitmap);

Image1 是 FMX 对象。
BMP 是标准 (VCL.Graphics) 位图。

我得到的错误是:

Project Project1.exe raised exception class EConvertError with message
'Cannot assign a TBitmapOfItem to a TBitmap'.

您不能将 FMX TBitmap 分配给 VCL TBitmap。它们彼此不兼容(一开始你甚至不应该在同一个项目中混合使用 VCL 和 FMX,它们不是为一起使用而设计的)。

您必须将 FMX TBitmap 保存到 BMP-formatted stream/file,然后将其加载到 VCL TBitmap.

使用文件很简单:

Image1.Bitmap.SaveToFile('file.bmp');
BMP.LoadFromFile('file.bmp');

但是,当使用流代替时,FMX 的 TBitmap.SaveToStream() 仅以 PNG 格式保存,因此您必须使用 TBitmapCodecManager.SaveToStream() 以保存为 BMP 格式,例如:

Strm := TMemoryStream.Create;
try
  Surface := TBitmapSurface.Create;
  try
    Surface.Assign(Image1.Bitmap);
    TBitmapCodecManager.SaveToStream(Strm, Surface, '.bmp');
  finally
    Surface.Free;
  end;
  Strm.Position := 0;
  BMP.LoadFromStream(Strm);
finally
  Strm.Free;
end;