17

为有点模糊的标题道歉,我无法弄清楚这里的关键字是什么。设置很简单,我打开一个图像

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 吓坏的情况下阅读它!

这是有问题的图像,以防万一:

在此处输入图像描述

4

3 回答 3

12

所以我遇到了同样的问题,发现图像是灰度的,默认的 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;
            }
        }
于 2012-07-20T00:19:15.063 回答
4

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

于 2013-03-27T06:33:31.440 回答
2

可以使用十二猴 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>
于 2017-10-19T09:20:50.750 回答