ImageIO.read非法参数exception – 栅格波段/颜色空间组件?

对于有点模糊的标题道歉,我无法弄清楚关键字在这里是什么。 设置非常简单,我打开图像

ImageIO.read(new File(filename)); 

这适用于大多数文件,但是对于一个我得到IllegalArgumentException with the detail: "numbers of source Raster bands and source color space components do not match" 。 这个图像是通过wget在有效的Flickr URL上获得的,我使用了这种方式获得的其他图像,因此获取图像的方法原则上看起来很合理。 我不确定导致exception的是什么。

解决方法可以接受 – 我特别不喜欢使用ImageIO ,图像看起来很精致。 我只需要在没有Java吓坏的情况下阅读它!

这是有问题的图像,如果有任何用处:

在此处输入图像描述

所以我遇到了同样的问题,发现图像是灰度级的,而且默认的ImageIO.read实现并没有弄清楚,因为图像元数据并不像预期的那样。 我写了一个解决方案,如果主负载失败,则将负载重试为’BufferedImage.TYPE_BYTE_GRAY’。

  Iterator iter = ImageIO.getImageReaders(stream); Exception lastException = null; while (iter.hasNext()) { ImageReader reader = null; try { reader = (ImageReader)iter.next(); ImageReadParam param = reader.getDefaultReadParam(); reader.setInput(stream, true, true); Iterator imageTypes = reader.getImageTypes(0); while (imageTypes.hasNext()) { ImageTypeSpecifier imageTypeSpecifier = imageTypes.next(); int bufferedImageType = imageTypeSpecifier.getBufferedImageType(); if (bufferedImageType == BufferedImage.TYPE_BYTE_GRAY) { param.setDestinationType(imageTypeSpecifier); break; } } bufferedImage = reader.read(0, param); if (null != bufferedImage) break; } catch (Exception e) { lastException = e; } finally { if (null != reader) reader.dispose(); } } // If you don't have an image at the end of all readers if (null == bufferedImage) { if (null != lastException) { throw lastException; } } 

错误消息提供信息,并指示如ICC颜色配置文件中所述的栅格波段数似乎不正确。 我使用ImageMagick从图像中剥离ICC配置文件。 ImageIO随后读取图像没有问题(~1k坏图像)。 希望有所帮助。

可以使用12monkeys ImageIO读取此图像,这是JRE提供的原始ImageIO的更强大和宽容的替代品。

请参阅https://github.com/haraldk/TwelveMonkeys/

我在PDF Box Jira中找到了这个解决方案https://issues.apache.org/jira/browse/PDFBOX-3637

为了使用十二个密钥,将其添加为maven依赖项就足够了。 然后它在默认图像处理器之前注册自己。

  com.twelvemonkeys.imageio imageio-jpeg 3.3.2