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

2022-09-03 02:03:12

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

ImageIO.read(new File(filename));

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

解决方法将是可以接受的 - 我对使用特别不满意,图像在视觉上看起来很好。我只需要让它被阅读而不会被Java吓坏!ImageIO

这是有问题的图像,以防它有任何用处:

enter image description here


答案 1

因此,我遇到了同样的问题,发现图像是灰度的,并且默认的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;
            }
        }

答案 2

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


推荐