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

标签 java image javax.imageio

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

打开一张图片
ImageIO.read(new File(filename));

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

变通办法是可以接受的 - 我对使用 ImageIO 并不特别在意,而且图像在视觉上看起来不错。我只需要让 Java 不慌乱地读取它!

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

enter image description here

最佳答案

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

关于java - ImageIO.read 非法参数异常 - 光栅带/颜色空间组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10416378/

相关文章:

java - 使用链表的多项式计算器

java - 从一个应用程序中的数据库在另一个应用程序中运行 SQLite 命令

CSS 背景图像缩放以适合屏幕高度

java - 图像未显示在绘画组件中

android - 图片未正确保存到数据库中(作为 BLOB)

java - 将 0-256 范围内的二维 int 数组转换为灰度 png?

java - TIFFPackBitsCompressor - NPE?

java - Swing 文本字段有时出现有时不出现?

java - 如何使用 Random.nextGaussian() 生成 N 个总和为 1 的 double

java - 用Java处理图像,而不是标签