【问题标题】:How to assign s a FMX.TImage to a VCL.TBitmap?如何将 FMX.TImage 分配给 VCL.TBitmap?
【发布时间】:2018-02-24 21:30:53
【问题描述】:

我尝试这样做:

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'.

【问题讨论】:

    标签: delphi firemonkey delphi-10.2-tokyo


    【解决方案1】:

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

    您必须将 FMX TBitmap 保存为 BMP 格式的流/文件,然后将其加载到 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;
    

    【讨论】:

    • 哇。那太恶心了!我需要将 bmp 传递给 windows api。看起来 FMX 不是为与 MS Windows 操作系统交互而设计的。将位图转换为 png 再转换回 bmp 会比我需要的要慢!
    • @Ampere 您不需要使用 VCL 与 FMX 中的 Win32 API 进行交互。只需直接调用 API 函数,就像任何其他函数一样,如果您正在制作跨平台应用程序,则将调用包装在 IFDEF 中。我在答案中显示的代码不是将 PNG 转换为 BMP,它显示了您必须做什么才能直接保存在 BMP 中并避免保存在 PNG 中(为什么 Embarcadero 没有添加可选扩展TBitmap.SaveToStream() 的参数是任何人的猜测,考虑到 TBitmap.SaveToFile() 是扩展感知的)
    猜你喜欢
    • 2016-06-08
    • 2016-10-20
    • 2020-09-19
    • 2016-03-01
    • 2015-02-15
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多