You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++Builder FMX下TBitmapCodecManager用法及编译报错咨询

错误原因

编译报错由两个写法问题直接导致:

  1. C++语法中,类的静态方法必须通过作用域解析符::调用,不能照搬Delphi中类名+.的调用方式,编译器会误将类型名当作实例变量解析,触发typedef使用错误。
  2. 传入的格式扩展名参数使用了单引号包裹'.ico',C++中单引号仅支持包裹单个char类型字符,字符串常量必须使用双引号包裹。FMX框架默认使用Unicode字符串,建议加L前缀显式声明宽字符字符串,避免隐式类型转换问题。
正确调用示例

首先确保代码中已引入对应头文件:

#include <FMX.Graphics.hpp>

功能实现代码:

TMemoryStream *strm = new TMemoryStream();
TBitmapSurface *bmpss = new TBitmapSurface();
TBitmapCodecSaveParams *pm = new TBitmapCodecSaveParams();

__try
{
    pm->Quality = 100;
    bmpss->Assign(Image1->Bitmap);
    // 静态方法通过::调用,扩展名传入宽字符串
    TBitmapCodecManager::SaveToStream(strm, bmpss, L".ico", pm);
    
    // 流使用前先重置指针位置
    strm->Position = 0;
    // 后续可按需处理流中ICO数据,例:存为本地文件
    // strm->SaveToFile(L"target.ico");
}
__finally
{
    // 释放所有手动创建的对象,避免内存泄漏
    delete pm;
    delete bmpss;
    delete strm;
}
补充说明
  • 若不需要自定义保存质量参数,SaveToStream的第四个参数可直接传NULL,无需手动创建TBitmapCodecSaveParams实例。
  • 该方法单次调用仅能生成单尺寸ICO文件,若需要适配系统显示的多分辨率图标,需按照ICO文件格式规范自行组装多个尺寸的位图数据。

内容的提问来源于stack exchange,提问作者Mr. FMX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:54:36