带有这个文件的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)发布于 2010-12-18 00:45:05
我想我已经找到你问题的症结所在了。我检查了你链接的图片( 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)之后,所以实际上不可能让一个
文件同时符合这两个标准。
尽管很久以前就有报道说
解决方法是使用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();希望这能有所帮助。
发布于 2013-10-10 05:18:35
顺便说一句,这个问题已经在JDK8中修复了(注意http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7064516底部的提交)。如上所述,我已经确认a pre-release build of JDK8正确加载了JDK7失败的图像。
发布于 2013-04-22 22:07:59
老帖子,但供将来参考:
受这个问题和这里找到的链接的启发,我为ImageIO写了一个JPEGImageReader插件,它支持具有这些“坏的”国际商会色彩配置文件的JPEG图像(“问题”是ICC配置文件中的渲染意图与Java的ColorConvertOp不兼容)。它是纯Java的,不需要JAI。源代码可在以下位置免费获得:
https://github.com/haraldk/TwelveMonkeys/tree/master/imageio/imageio-jpeg
https://stackoverflow.com/questions/4470958
复制相似问题