读字节数组WITHOUT ImageIO的缓冲的图像(Read byte array into bu

2019-10-20 10:14发布

我有把一个字节数组的BufferedImage使用ImageIO的一个代码。

public void readImage(byte[] imageBytes) {
    ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
    BufferedImage bufferedImage = null;

    try {
        bufferedImage = ImageIO.read(inputStream);
    } catch (Exception e) {
        e.printStackTrace();
    }
    // do something with bufferedImage
}

但我发现,对于某些JPEG图像,它抛出一个CMMException,每一次。

这里的堆栈跟踪:

java.awt.color.CMMException: Cannot get color transform
        at sun.java2d.cmm.lcms.LCMS.createNativeTransform(Native Method)
        at sun.java2d.cmm.lcms.LCMSTransform.<init>(LCMSTransform.java:103)
        at sun.java2d.cmm.lcms.LCMS.createTransform(LCMS.java:75)
        at java.awt.image.ColorConvertOp.filter(ColorConvertOp.java:552)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(JPEGImageReader.java:1251)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1219)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1022)
        at javax.imageio.ImageIO.read(ImageIO.java:1438)
        at javax.imageio.ImageIO.read(ImageIO.java:1342)

而这里的是造成麻烦的照片

我搜索在谷歌的解决方案,并发现后承认问题,并建议使用JAI对于其中ImageIO的失败案例。 但我有疑问,作为后,从4年前了,我似乎无法找到关于JAI多的信息,导致我相信这不是理想的解决方案。 是否有任何其他方式字节数组转换为缓冲的图像,而不ImageIO的或JAI? 如果今天的固溶体JAI是静止的,可能有人告诉我该怎么做,使用JAI?

提前致谢!

Answer 1:

首先,你可以用我的TwelveMonkeys JPEG插件的ImageIO的,它会读取该JPEG 。 无需更改代码。 从我记得,这个问题是,它包含了Corbis的RGB ICC色彩配置文件,使用过期或损坏的ICC配置文件格式。 我的读者会修补ICC配置文件在运行时,并读取图像就好了。

另外,在堆栈跟踪LCMS引用表示你要么OpenJDK的或,爪哇8.对于Java 8至少有一个开关-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider重新启用柯达CMS(在所有的Sun /甲骨文的JRE前的Java 8中),LittleCMS被选为从Java 8的默认后,有这些色彩管理系统如何处理ICC配置文件的细微差别,所以设定这个开关可能会在某些情况下帮助。

更新:我只是试图读取图像和Java版本1.7.0_60可以读取图像,但是颜色是稍微偏离(它在Chrome浏览紫色色调,等等),因为ICC配置文件将被忽略。 这可能是对你不够好。 如果不是,请使用TwelveMonkeys JPEG插件。 :-)



文章来源: Read byte array into buffered image WITHOUT ImageIO