Windows11下VS2019/2022编译PNG资源触发Generic GDI+错误求助
解决编译资源时PNG触发的「Generic GDI+ error」问题
问题诊断
从描述和构建日志来看,错误发生在GenerateResource任务序列化PNG图片资源的过程中:32位的resgen.exe在尝试将Bitmap对象序列化为二进制资源时,调用Image.Save(MemoryStream)抛出GDI+错误。你已排除编码器缺失和文件权限问题,且VS2022存在相同问题,说明这是Windows11与.NET Framework资源编译工具的兼容性问题,核心是32位进程处理PNG时触发的系统GDI+ bug。
可行解决方案
方案1:将PNG资源以二进制字节流形式嵌入,绕过Bitmap序列化
修改Resources.resx中PNG资源的存储类型,避免resgen对Bitmap对象的序列化操作:
- 打开Resources.resx文件,选中目标PNG资源
- 在属性窗口中,将「类型」从
System.Drawing.Bitmap改为System.Byte[] - 重新编译项目
运行时加载图片的代码需调整为:
using (var ms = new MemoryStream(Resources.MyPngResource)) { var bitmap = new Bitmap(ms); // 后续图片操作逻辑 }
该方案直接存储原始PNG字节流,彻底规避GDI+序列化错误。
方案2:强制使用64位资源编译工具
若项目目标平台为64位,可配置MSBuild调用64位版本的resgen.exe:
- 右键项目→属性→生成,将目标平台设置为x64(若为AnyCPU则取消勾选「首选32位」)
- 编辑项目文件(.csproj),添加以下配置:
<PropertyGroup> <ResGenToolArchitecture>x64</ResGenToolArchitecture> </PropertyGroup>
通过切换64位工具进程,避开Windows11上32位GDI+的兼容性问题。
方案3:修复系统与.NET Framework环境
- 安装最新的Windows11累积更新,修复系统级GDI+底层bug
- 更新.NET Framework到最新兼容版本(你的项目基于.NET4.0,可安装.NET Framework 4.8.1及后续更新包)
针对复现代码的临时修复
你的测试代码中,默认创建的Bitmap像素格式为Format32bppRgb(无Alpha通道),指定带Alpha的格式可临时解决测试代码的报错:
static void Main(string[] args) { var image = new Bitmap(10, 10, System.Drawing.Imaging.PixelFormat.Format32bppArgb); image.Save(new MemoryStream(), ImageFormat.Jpeg); // works ok image.Save(new MemoryStream(), ImageFormat.Png); // 可正常执行 }
此方法仅适用于测试代码,实际项目需采用方案1或方案2彻底解决问题。
内容的提问来源于stack exchange,提问作者James Huntington
相关产品推荐
相关产品推荐

