当前位置: 首页 > 知识库问答 >
问题:

将字节数组读取到无ImageIO的缓冲图像中

桑飞语
2023-03-14

我有一段代码,可以使用ImageIO将字节数组转换为BuffereImage。

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图像,每次都会抛出CMM异常。

这是堆栈跟踪:

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)

我在Google上搜索了一个解决方案,发现了一个帖子承认了这个问题,并建议在ImageIO失败的情况下使用JAI。但我有疑问,因为这篇帖子是4年前的,我似乎找不到太多关于JAI的信息,这让我相信这不是理想的解决方案。有没有其他方法可以在没有ImageIO或JAI的情况下将字节数组转换为缓冲图像?如果JAI今天仍然是一个可靠的解决方案,有人能告诉我如何使用JAI做到这一点吗?

提前感谢!

共有1个答案

孟胤
2023-03-14

首先,您可以使用我的TwelveMonkey JPEG插件for ImageIO,它会读取此JPEG。无需更改代码。据我所知,问题是它包含Corbis RGB ICC颜色配置文件,使用过时或损坏的ICC配置文件格式。我的阅读器将在运行时修补ICC配置文件,并很好地读取图像。

此外,堆栈跟踪中的LCMS引用表示您在OpenJDK或Java 8上。至少对于Java 8,有一个开关-Dsun。java2d。cmm=太阳。java2d。cmm。kcms。KCMServiceProvider重新启用Kodak CMS(在Java 8之前的所有Sun/Oracle JRE中使用),在Java 8中选择LittleCMS作为默认值之后。这些颜色管理系统处理ICC配置文件的方式有一些细微的差别,因此设置此开关在某些情况下可能会有所帮助。

更新:我刚刚尝试读取图像,Java1.7版。0_60可以读取图像,但是颜色有点不对劲(它会变成紫色,就像Chrome一样),因为ICC配置文件被忽略了。这对你来说可能已经足够好了。如果没有,请使用TwelveMonkey JPEG插件。:-)

 类似资料:
  • 问题内容: 我知道 bufio 包中的golang中的特定功能。 Peek返回下一个n个字节, 而不会使阅读器前进 。在下一个读取调用中,字节停止有效。如果Peek返回的字节数少于n个字节,则它还会返回一个错误,解释读取短的原因。如果n大于b的缓冲区大小,则错误为ErrBufferFull。 我需要能够从阅读器读取特定数量的字节,以 使阅读器更先进 。基本上,与上面的功能相同,但是它使阅读器更高级

  • 如果图像不是RGB颜色,如何解码。它应该通过支持所有格式(Jpg、Png、Gif等)来解码图像,任何api都可以解码。 这是失败的代码行。那么可以使用哪种方法来重新处理这个问题。

  • 问题内容: 我在Java中得到了一个byte []数组,其中包含图像的字节,我需要将其输出到图像中。我将如何去做呢? 非常感谢 问题答案:

  • 比方说,我有一个字节数组,包含没有标题的原始位图数据。 但是位图数据有点奇怪,我不太确定,但是如果宽度是NPOT(不是二次方),位图数据似乎没有正确对齐 我使用以下代码从此类位图数据构造bmp: 到目前为止,代码运行良好。但由于某些原因,我需要实现“导入位图”,这意味着我需要从位图实例中获取“奇怪”的位图数据。 我该怎么做?

  • 问题内容: 给定一个图像文件,比如说PNG格式,我如何获得表示位于第i行第j列的像素的int [r,g,b,a]数组? 到目前为止,我从这里开始: 提前致谢! 问题答案: 您需要以形式获取打包像素值,然后可以使用其构建颜色对象,从中提取RGBA值,例如… 这不是最有效的方法,但它是最简单的方法之一

  • 我目前正在尝试制作一个画布,我可以绘制的东西,并使它出现在一个JFrame。 为此,我打算在一个JPanel组件中有一个BufferedImage,paintComponent方法可以从中进行绘制。 理想情况下,我希望能够从给定的JFrame中引用这个缓冲图像,然后使用其Graphics2D向其绘制素材,paintComponent方法可以在使用缓冲图像绘制时显示这些素材。 我这样做是为了避免直接