【问题标题】:Why does loading this jpg using JavaIO give CMMException?为什么使用 Java IO 加载此 jpg 会产生 COMException?
【发布时间】:2011-05-27 03:18:14
【问题描述】:

ImageIO.read(imagePath) 与这个文件给出一个 CMMException,为什么 Java 不能处理这个看似有效的文件http://www.jthink.net/jaikoz/scratch/front.jpg

java.awt.color.CMMException: Invalid image format
    at sun.awt.color.CMM.checkStatus(Unknown Source)
    at sun.awt.color.ICC_Transform.<init>(Unknown Source)
    at java.awt.image.ColorConvertOp.filter(Unknown Source)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(Unknown Source)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source)
    at javax.imageio.ImageIO.read(Unknown Source)
    at javax.imageio.ImageIO.read(Unknown Source)

【问题讨论】:

  • 您使用的是哪个版本的 Java?它适用于 jdk 1.5 anf 1.6。
  • 嗯,我在 WIndows 7 上使用 1.6.22
  • 我已经添加了堆栈跟踪,也许这会对它有所启发

标签: java image-processing jpeg javax.imageio


【解决方案1】:

我想我明白了你的问题。我检查了您链接的图像(http://www.jthink.net/jaikoz/scratch/front.jpg)。这是由于 Exif 和 JFIF 标准。

当您执行ImageIO.read('some file') 之类的操作时,它会调用默认的 sun jpeg 实现 com.sun.imageio.plugins.jpeg.JPEGImageReader。以前在加载 JFIF 文件BUG 6488904 时遇到问题(请查看最后的评论)。

根据规范,Exif 和 JFIF 要求他们各自 应用程序标记段必须是 在 SOI 之后(APP1 和 APP0) , 所以实际上不可能 符合标准的 JPEG 文件规范 两种标准。

虽然很久以前就被报道过

解决方法是使用 JAI 库 (https://jai.dev.java.net/binary-builds.html#Release_builds)。我使用的是 Java(无原生加速) 版本。

SeekableStream seekableStream =  new FileSeekableStream(new File("front.jpg"));
ParameterBlock pb = new ParameterBlock();
pb.add(seekableStream);

BufferedImage image = JAI.create("jpeg", pb).getAsBufferedImage();

希望这会有所帮助。

【讨论】:

  • @user294896:不客气。如果答案解决了您的问题,请将其标记为已接受。这样,它将不在未答复的列表中。谢谢。
  • 是的,它有效,我只是想知道有没有办法使用公共 API 而不是底层的 Sun 类(例如 SeekableStream)
【解决方案2】:

顺便说一句,这个问题在 JDK8 中已修复(注意http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7064516 底部的提交)。我已经确认a pre-release build of JDK8 正确加载了如上所述 JDK7 失败的图像。

【讨论】:

    【解决方案3】:

    旧帖,但供将来参考:

    受此问题和此处找到的链接的启发,我为 ImageIO 编写了一个 JPEGImageReader 插件,该插件支持具有这些“坏”ICC 颜色配置文件的 JPEG 图像(“问题”是 ICC 配置文件中的渲染意图不兼容使用 Java 的 ColorConvertOp)。它是纯 Java,不需要 JAI。源代码可在以下位置免费获得:

    https://github.com/haraldk/TwelveMonkeys/tree/master/imageio/imageio-jpeg

    【讨论】:

    • 你能否在你的 GitHub README 中提供一个关于如何集成和使用你的插件的小解释和示例?那太好了。
    • @Jack 我会这样做的。此外,如果您特别喜欢记录任何内容,请随时在 GitHub 上为缺少的文档提交问题。但是您需要做的就是使用 Maven 构建项目,并将 JAR 放在类路径中。您将像使用标准 JPEG 插件(即 ImageIO.read(...)ImageIO.getImageReaders(...))一样使用它。
    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 2014-03-24
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2016-03-29
    • 2014-11-20
    相关资源
    最近更新 更多