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

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:

  1. 右键项目→属性→生成,将目标平台设置为x64(若为AnyCPU则取消勾选「首选32位」)
  2. 编辑项目文件(.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:00:10