Windows Server 2025中.NET Framework 4.8.1 JPEG转PNG偏移及数据丢失
Windows Server 2025下System.Drawing.Image保存PNG字节数组异常的根因分析
问题现象
在Windows Server 2025环境测试应用时,导入的JPEG图像显示异常。排查后确认:该环境下通过System.Drawing.Image.Save生成的PNG格式字节数组,与Windows 11等版本存在显著差异——数组大小仅为预期的一半左右,且从某一数据节点开始内容偏离。未修复时,Windows Server 2025中图像会出现偏移、信息丢失;其他Windows版本则显示正常,生成的字节数组大小约为Server 2025的两倍。已验证桌面版Windows Server 2025的GDI+功能可用。
原正常运行代码(除Windows Server 2025外)
using (MemoryStream ms = new MemoryStream()) { image.Save(ms, ImageFormat.Png); this.m_imageBytes = ms.ToArray(); }
临时修复方案
通过先转存为BMP格式,再重新编码为PNG的方式规避问题:
using (MemoryStream ms = new MemoryStream()) { image.Save(ms, ImageFormat.Bmp); using (MemoryStream ms2 = new MemoryStream()) { Image bmp = Bitmap.FromStream(ms); bmp.Save(ms2, ImageFormat.Png); this.m_imageBytes = ms2.ToArray(); } }
根因解析
该问题的核心在于Windows Server 2025中GDI+组件的PNG编码器逻辑变更或存在bug,具体可能的原因包括:
- 编码器版本与压缩策略变更:Windows Server 2025更新了GDI+的PNG编码器,默认启用了更高压缩率的算法,但编码器对部分JPEG图像(尤其是特定色彩空间、像素格式的JPEG)的编码逻辑存在缺陷,导致生成的PNG字节数组被错误截断或数据偏移。
- 像素格式处理差异:JPEG图像通常采用YCbCr色彩空间,直接通过GDI+编码为PNG时,Windows Server 2025的编码器对YCbCr转RGB的处理逻辑与旧版本不同,导致像素数据编码异常;而先转存为BMP后,图像会被转换为标准RGB像素格式,此时PNG编码器处理RGB数据的逻辑与旧版本一致,因此能生成正确的字节数组。
- 服务器环境优化参数影响:Windows Server 2025针对服务器场景默认启用了GDI+的内存优化或资源限制策略,导致直接保存PNG时内存流的写入操作未完整执行,进而生成不完整的字节数组。
内容的提问来源于stack exchange,提问作者Jeff M
相关产品推荐
相关产品推荐

