我有一个我编写的 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 块之前发现一个“流氓”IDAT 块。一个这样的 IDAT 块(以及下面的 IEND 块)在十六进制编辑器中看起来像这样。这些是文件中的最后 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 块长度显示为 0xFFF4。但是,很明显,IDAT 块(甚至是文件中的字节数)并不多。
有没有其他人遇到过这个问题?我可以通过以下几种方式之一解决问题。我可以手动编辑 PNG 文件以删除最后一个 IDAT 块(或将其大小设置为 0。)我可以运行修复损坏的 PNG 的辅助程序。但是,我想要一个 C#/.NET 解决方案,我可以轻松地将其添加到我的原始程序中。理想情况下,我想要一个不需要我将 PNG 作为二进制文件重新打开的解决方案;检查错误的 IDAT 块;并重新编写PNG。但是,我开始认为这是我需要做的。