javax.imageio.IIOException:无效的icc配置文件:重复的序列号

时间:2015-08-15 10:27:32

标签: java jpeg javax.imageio image-loading

我试图读取JPEG文件,但是当我尝试这样做时:

    InputStream input = new URL("http://s4.postimg.org/h1c72546l/invalid_icc_profile.jpg").openStream();
    try {
        ImageIO.read(input);
        System.out.println("Image loaded.");
    } catch (Throwable e) {
        e.printStackTrace();            
    } finally {
        input.close();
    }   

我收到以下例外:

javax.imageio.IIOException: Invalid icc profile: duplicate sequence numbers
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(JPEGImageReader.java:604)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:342)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:476)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:597)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1054)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1034)
at javax.imageio.ImageIO.read(ImageIO.java:1448)
at javax.imageio.ImageIO.read(ImageIO.java:1352)

此异常仅在以下图片中出现:http://s4.postimg.org/h1c72546l/invalid_icc_profile.jpg

我测试了JDK 7和8,两者都有错误。 您对我如何阅读图像有什么建议吗?可以调整icc配置文件吗?

1 个答案:

答案 0 :(得分:2)

如错误消息所示,JPEG文件中的ICC_PROFILE段包含重复的序列号。这意味着编写它的软件会以某种方式被破坏。但是,图像数据仍应可读,即使颜色可能看起来不完全正确。

由于JFIF(JPEG文件交换格式)的段大小有限,因此必须将大型ICC配置文件拆分为多个段。规范说ICC配置文件应该存储在多个APP2段中,并且每个段必须以空终止字符串ICC_PROFILE开头,然后是单个无符号字节序列号和总计数。

我的TwelveMonkeys ImageIO JPEG plugin能够读取您的图片,即使ICC配置文件片段已损坏也是如此。它将发出警告(如果您已注册IIOReadWarningListener),告知您将忽略ICC配置文件。我已经测试过,它可以与您的JPEG文件一起使用。您不需要更改任何代码,只需添加所需的依赖项(来自上面的链接),它应该可以工作。

您可以下载最新的TwelveMonkeys ImageIO plugins from the Maven repository

如果您知道自己在做什么,也可以使用十六进制编辑器修复配置文件的索引/计数。 :-)但是根据经验,这些图像的轮廓可能与图像的颜色数据不匹配,所以你可能会运气不好。