gpt4 book ai didi

c# - .NET Image.Save 偶尔会生成带有错误 IDAT block 的 PNG

转载 作者:可可西里 更新时间:2023-11-01 07:48:32 24 4
gpt4 key购买 nike

我有一个我编写的 C#/.NET 实用程序,可以从磁盘加载 PNG 图像

Bitmap b = Bitmap.FromStream(new MemoryStream(File.ReadAllBytes(filename))) as Bitmap;

对它们执行多种转换(旋转、缩放、alpha),然后根据应用的转换以不同的文件名将生成的 PNG 图像保存回磁盘

b.Save(outputName, ImageFormat.Png);

我已经使用该实用程序成功编写了数千个 PNG。但是,有时其中一个 PNG 无法加载到使用 libpng 的单独程序中。在该程序中,libpng 给出错误“找到太多 IDAT”

查看 PNG 文件会发现在文件末尾 IEND block 之前有一个“流氓”IDAT block 。一个这样的 IDAT block (和下面的 IEND block )在十六进制编辑器中看起来像这样。这些是文件中的最后 24 个字节。

IDAT: 0x00 0x00 0xFF 0xF4 0x49 0x44 0x41 0x54 0x35 0xAF 0x06 0x1E    
IEND: 0x00 0x00 0x00 0x00 0x49 0x45 0x4e 0x44 0xAE 0x42 0x60 0x82

IDAT block 长度显示为 0xFFF4。然而,很明显,IDAT block (甚至文件)中没有那么多字节。

有没有人遇到过这个问题?我可以通过多种方式之一解决问题。我可以手动编辑 PNG 文件以删除最后一个 IDAT block (或将其大小设置为 0)。我可以运行辅助程序来修复损坏的 PNG。但是,我想要一个 C#/.NET 解决方案,我可以轻松地将其添加到我的原始程序中。理想情况下,我想要一个不需要我将 PNG 作为二进制文件重新打开的解决方案;检查坏的 IDAT block ;并重新编写 PNG。但是,我开始认为这就是我需要做的。

最佳答案

老问题。

.NET 在处理图像方面出了名的差。编解码器是旧的 win32 编解码器,有很多错误。

.NET 并不总是释放读/写图像文件时使用的操作系统资源,即使您遵循推荐的处置和/或使用方法也是如此。

关于c# - .NET Image.Save 偶尔会生成带有错误 IDAT block 的 PNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com