gpt4 book ai didi

java - 奇怪的 PNG 错误 : Bad length for IHDR chunk

转载 作者:行者123 更新时间:2023-11-30 06:20:45 27 4
gpt4 key购买 nike

这里是错误:

Exception in thread "main" javax.imageio.IIOException: I/O error reading PNG header!
at com.sun.imageio.plugins.png.PNGImageReader.readHeader(PNGImageReader.java:307)
at com.sun.imageio.plugins.png.PNGImageReader.readMetadata(PNGImageReader.java:637)
at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1212)
at com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1560)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1282)
at Bundle.iconExists(Bundle.java:139)
at Bundle.dPhIconExists(Bundle.java:158)
at BundleAnalyzer.supports6(BundleAnalyzer.java:14)
at TheifReader.<init>(TheifReader.java:14)
at TheifReader.main(TheifReader.java:63)
Caused by: javax.imageio.IIOException: Bad length for IHDR chunk!
at com.sun.imageio.plugins.png.PNGImageReader.readHeader(PNGImageReader.java:239)
... 10 more

这是导致它的代码:

        bimg = ImageIO.read(icons[i]);

icons 是一个文件数组。奇怪的是,我的电脑可以在任何图像查看器中正常读取图像。谷歌搜索错误没有给我任何结果。我有大量图像需要阅读,那么除了将图像转换为 BufferedImage 之外,它们是获取图像尺寸的另一种方法吗?这会解决问题吗?有没有办法修复这些图像?我通过从 iOS 设备收集应用程序图标得到它们。在我自己的设备上进行的测试没有产生任何错误,尽管之前作为 zip 文件的一部分发送的测试虽然以相同的方式收集,但经常会产生此错误。我所知道的关于压缩的一切都告诉我这不应该发生。我不确定从哪里开始寻找,真的需要修复。 Here is an example of a failed image .

我应该注意,对于我程序的这一部分,我只需要图像尺寸。我相信这可以通过读取元数据来获得,但我也无法用 java 找到这方面的细节。

最佳答案

根据PNG specifiaction :

4.1.1. IHDR Image header

The IHDR chunk must appear FIRST.

您的示例图像包含自定义关键 block CgBI 作为第一个 block ,并且不符合此规范。这就是您获得异常的原因。

实际上,您的图像似乎是“iOS 优化的 PNG”。

来自 http://fileformats.archiveteam.org/wiki/CgBI :

It is not compatible with PNG. Standard PNG decoders that don't support it will fail gracefully, due to an unknown "critical chunk".

现在,com.sun.imageio.plugins.png.PNGImageReader 中可能应该被视为错误的是它不检查第一个 block 实际上是 IHDR block ,在声称它可以读取输入之前。

您可以修复图像,方法是在您认为可以正常读取的查看器/应用程序之一中读取它们,然后将它们作为普通 PNG 写回。我在 OS X 上使用 Preview 进行了测试,它运行良好。试一试。

如果在 OS X 上(使用开发工具),您还应该能够通过以下命令行使用 Apple 修改后的 pngcrush:

xcrun -sdk iphoneos pngcrush -revert-iphone-optimizations infile.png outfile.png

如果您只想获取图像的宽度/高度,则无需读取完整的 BufferedImages,只需获取一个 ImageReader 并使用它的 getWidth(0)getHeight(0) 方法(SO 上已经有很多示例,无需重复)。

您可能还可以创建一个快速的 PNG 结构解析器,它会跳过 CgBI block ,并直接解析 IHDR,以获得宽度/高度。

关于java - 奇怪的 PNG 错误 : Bad length for IHDR chunk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21359540/

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