java - 为什么使用 JavaIO 加载此 jpg 会出现 CMMException?

标签 java image-processing jpeg javax.imageio

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)

最佳答案

我想我已经掌握了您的问题。我检查了您链接的图像( 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 (检查最后的评论)。

According to spec, both Exif and JFIF demands that their respective application marker segment must be the first right after SOI (APP1 and APP0) , so it is actually not possible per spec for an JPEG file to be compliant with both standards.

虽然早有报道

解决方法是使用 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();

希望这会有所帮助。

关于java - 为什么使用 JavaIO 加载此 jpg 会出现 CMMException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4470958/

相关文章:

python - 比较从多个角度拍摄的数百张 JPEG 图像

使用 EJB 的 Glassfish v3 上的 Java Web 服务

java - 如何检查字符串是否包含特定范围内的数字,例如java中的11到26

java - 对一个实体使用两个实体管理器

java - 使用递归方法Java将十进制转换为十六进制

java - 可将光栅写入图像-png 格式?

c++ - 使蒙版外全部透明

image - 如何根据矩阵值检测图像的一部分?

ios - AVFoundation 或 VideoToolbox JPEG 压缩

java - 将字节数组转换/显示为 bmp/jpeg 图像