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

GDI+ C++:使用EncoderParameters时Image::Save返回InvalidParameter的原因

从图片获取EncoderParameters后调用Image::Save返回InvalidParameter的原因

未使用Gdiplus::EncoderParameters*时,图片可成功保存;但从图片获取参数后调用Image::Save()会返回InvalidParameter,导致保存失败,请问原因是什么?

代码示例:

Bitmap* bmp = ...;   // 从文件加载的JPEG图片
const CLSID clsID = GetEncoderClsid(L"image/jpeg");

EncoderParameters* encodParams = NULL;
UINT size = bmp->GetEncoderParameterListSize(&clsID);
if (size > 0) {
    encodParams = (Gdiplus::EncoderParameters*)malloc(size);
    if (Gdiplus::Status::Ok == bmp->GetEncoderParameterList(&clsID, size, encodParams)){
            const WCHAR* dst = ...;
            bmp->Save(dst, &clsID, encodParams);
      }
}

原因分析

核心问题是从已有图片获取的EncoderParameters包含编码器不支持用于保存的参数:

  • GetEncoderParameterList获取的参数列表,包含了该图片文件读取时的所有参数(比如JPEG的元数据、解码相关参数),其中部分参数是只读/仅用于解码流程的,编码阶段无法识别或处理这些参数。
  • 当你直接把这个完整参数列表传给Save方法时,其中的无效参数会触发编码器返回InvalidParameter错误。

解决方法

  • 不要直接复用从图片读取的完整参数列表,而是根据需求手动构建仅包含编码所需的参数(比如JPEG的质量参数EncoderQuality)。
  • 示例修改(仅设置JPEG质量参数):
Bitmap* bmp = ...; // 从文件加载的JPEG图片
const CLSID clsID = GetEncoderClsid(L"image/jpeg");

// 手动构建编码参数
Gdiplus::EncoderParameters encodParams;
encodParams.Count = 1;
encodParams.Parameter[0].Guid = Gdiplus::EncoderQuality;
encodParams.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong;
encodParams.Parameter[0].NumberOfValues = 1;
ULONG quality = 80; // 质量范围0-100,数值越高质量越好
encodParams.Parameter[0].Value = &quality;

const WCHAR* dst = ...;
bmp->Save(dst, &clsID, &encodParams);
  • 若需复用原图片的部分参数,需先筛选出编码器支持的可写编码参数,剔除只读或解码相关的无效参数。

内容的提问来源于stack exchange,提问作者emanon228

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:55:16