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
相关产品推荐
相关产品推荐

