Java ImageIO.read非法参数异常-光栅带/颜色空间组件?

Java ImageIO.read非法参数异常-光栅带/颜色空间组件?,java,image,javax.imageio,Java,Image,Javax.imageio,抱歉标题有点模糊,我搞不清楚这里的关键词是什么。设置非常简单,我正在用 ImageIO.read(new File(filename)); 这适用于大多数文件,但是对于其中一个文件,我得到了一个带有详细信息的IllegalArgumentException:“源光栅带和源颜色空间组件的数量不匹配”。这张图片是通过wget在一个有效的flickrurl上获得的,我也使用了其他通过这种方式获得的图片,所以获取图片的方法在原则上似乎是合理的。我不确定是什么导致了异常 一个变通方法是完全可以接受的——

抱歉标题有点模糊,我搞不清楚这里的关键词是什么。设置非常简单,我正在用

ImageIO.read(new File(filename));
这适用于大多数文件,但是对于其中一个文件,我得到了一个带有详细信息的
IllegalArgumentException:“源光栅带和源颜色空间组件的数量不匹配”
。这张图片是通过wget在一个有效的flickrurl上获得的,我也使用了其他通过这种方式获得的图片,所以获取图片的方法在原则上似乎是合理的。我不确定是什么导致了异常

一个变通方法是完全可以接受的——我并不特别在意使用
ImageIO
,而且图像在视觉上看起来很好。我只需要让它在没有Java崩溃的情况下被读取

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


所以我遇到了同样的问题,发现图像是灰度的,默认的ImageIO.read实现没有解决这个问题,因为图像元数据与预期的不完全一样。我写了一个变通方法,如果主加载失败,将以“BuffereImage.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;
            }
        }
Iterator iter=ImageIO.getImageReaders(流);
异常lastException=null;
while(iter.hasNext()){
ImageReader=null;
试一试{
reader=(ImageReader)iter.next();
ImageReadParam param=reader.getDefaultReadParam();
setInput(流、真、真);
迭代器imageTypes=reader.getImageTypes(0);
while(imageTypes.hasNext()){
ImageTypeSpecifier ImageTypeSpecifier=imageTypes.next();
int bufferedImageType=imageTypeSpecifier.getBufferedImageType();
if(BuffereImage类型==BuffereImage.TYPE\u BYTE\u GRAY){
参数setDestinationType(imageTypeSpecifier);
打破
}
}
BuffereImage=reader.read(0,参数);
如果(null!=BuffereImage)中断;
}捕获(例外e){
lastException=e;
}最后{
if(null!=reader)reader.dispose();
}
}
//如果在所有阅读器的末尾没有图像
if(null==buffereImage){
if(null!=lastException){
抛出最后一个异常;
}
}

错误消息提供信息,表明ICC颜色配置文件中提到的光栅带数似乎不正确。我曾经从图像中删除ICC配置文件。ImageIO随后在读取图像时没有问题(~1k个坏图像)。希望这会有所帮助。

使用TwelveMonecks ImageIO阅读此图像是可能的,它是JRE提供的原始ImageIO的一个更强大、更宽容的替代品

我在PDF框Jira中找到了这个解决方案

为了使用twelvemonkeys,将其添加为maven依赖项就足够了。然后,它会在默认图像处理器之前注册自身

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

com.tweelvemonkeys.imageio
图像jpeg
3.3.2 

我收到了相同的错误(至少在使用
ImageIO.read(新URL(“http://i.imgur.com/rC6Jk.jpg);
)。这是您正在处理的唯一黑白图像吗?很难说-图像检索过程的本质是非常无方向性的(想法是该软件是自主的!)但它是唯一一个饱和度如此低的图像。你认为这就是原因吗?你找到解决办法了吗?没有。我不得不依赖这样一个事实:如果出现这个错误,其他的图像也会被发现。这样做的好处是:一个本该花我两个小时才能解决的问题现在需要10分钟。谢谢你,泰特·摩尔,太棒了!没想到有人会回来把这个打倒,但你做到了!可爱的东西。当我在ImageIO.read(InputStream)失败后使用此解决方案时,它不会执行其余的代码(而(iter.hasNext())为false),但如果我省略ImageIO.read(InputStream)部分,它会执行任务。我的代码有什么问题?+1,因为它适用于某些灰度情况,而不适用于ImageIO.read(…)。但请注意,此代码强制图像加载为灰度,即使不是灰度。您必须首先创建一个ImageIO.read(…)&如果失败,请使用此方法。如果有人想知道如何获取
流,则可以使用
ImageIO.CreateMageInputStream(InputStream)
(此参数可以是
FileInputStream
ByTearayInputStream
等)创建该流。它做到了!谢谢我肯定认为这条信息很有用,只是超出了我的理解水平,不是他们的错。感谢评论:)