ImageIO.read非法参数异常 - 栅格波段/颜色空间组件?

时间:2012-05-02 15:01:19

标签: java image javax.imageio

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

打开图像
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上获得的,并且我使用了这种方式获得的其他图像,因此获取图像的方法原则上看起来很合理。我不确定导致异常的是什么。

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

以下是有问题的图片,如果有任何用处:

enter image description here

3 个答案:

答案 0 :(得分:11)

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

            Iterator<ImageReader> 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<ImageTypeSpecifier> 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;
            }
        }

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

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

我在PDF Box Jira https://issues.apache.org/jira/browse/PDFBOX-3637

中找到了这个解决方案

为了使用十二个密钥,只需将其添加为maven依赖项即可。然后它在默认图像处理器之前注册。

<dependency>
    <groupId>com.twelvemonkeys.imageio</groupId>
    <artifactId>imageio-jpeg</artifactId>
    <version>3.3.2</version> <!-- Alternatively, build your own version -->
</dependency>