无法使用 ImageIO.read(文件文件)读取 JPEG 图像

2022-08-31 21:19:02

我在使用ImageIO.read(File file)读取此JPEG文件时遇到问题 - 它引发异常,并显示消息“不支持的图像类型”。

我尝试过其他JPEG图像,它们似乎工作正常。

我能够发现的唯一区别是此文件似乎包含缩略图 - 这是否已知会导致ImageIO.read()出现问题?

Troublesome image

编辑:

添加了生成的图像:

Strange colors


答案 1

旧帖子,但供将来参考:

受到这个问题和在这里找到的链接的启发,我为ImageIO编写了一个JPEGImageReader插件,该插件支持CMYK颜色模型(既可以使用原始颜色模型,也可以在读取时隐式转换为RGB)。与此处提到的其他解决方案相比,阅读器还使用嵌入在JPEG流中的ICC配置文件进行适当的颜色转换。

它是普通的Java,不需要JAI。源代码和二进制发行版在 github.com/haraldk/TwelveMonkeys 免费提供,并由BSD风格的许可证覆盖。

安装完成后,它允许您使用如下方式读取CMYK JPEG:ImageIO.read(...)

File cmykJPEGFile = new File(/*path*/);
BufferedImage image = ImageIO.read(cmykJPEGFile);

即:在大多数情况下,没有必要修改代码。


答案 2

您的图像“颜色模型”是 CMYK,(读取文件的内部类)仅读取 RGB 颜色模型。JPEGImageReader

如果您坚持阅读CMYK图像,那么您将需要转换它们,请尝试此代码。

更新

将 CMYK 图像读取到 RGB BufferedImage 中。

    File f = new File("/path/imagefile.jpg");

    //Find a suitable ImageReader
    Iterator readers = ImageIO.getImageReadersByFormatName("JPEG");
    ImageReader reader = null;
    while(readers.hasNext()) {
        reader = (ImageReader)readers.next();
        if(reader.canReadRaster()) {
            break;
        }
    }

    //Stream the image file (the original CMYK image)
    ImageInputStream input =   ImageIO.createImageInputStream(f); 
    reader.setInput(input); 

    //Read the image raster
    Raster raster = reader.readRaster(0, null); 

    //Create a new RGB image
    BufferedImage bi = new BufferedImage(raster.getWidth(), raster.getHeight(), 
    BufferedImage.TYPE_4BYTE_ABGR); 

    //Fill the new image with the old raster
    bi.getRaster().setRect(raster);

更新 - 2015 年 3 月 - 添加模拟图像

原始图像已从OP的Dropbox中删除。因此,我正在添加新图像(而不是原始图像),以模拟它们所发生的问题。

第一个图像是普通 RGB 图像的外观。

Image RGB

第二个图像是相同图像在CMYK颜色模型中的外观。

您实际上无法看到它在网络上的外观,因为它将被主机转换为RGB。要确切地看到它的外观,请获取RGB图像并通过RGB到CMYK转换器运行它。

第三个图像是 CMYK 图像在使用 Java ImageIO 读取然后编写时的外观。

Image CMYK read through Java RGB

OP发生的问题是他们有类似图像2的东西,当你尝试阅读它时会引发异常。


推荐