Java ImageIO 将图像 byte[] 读取到预分配的 BufferedImage 中

标签 java arrays image memory bufferedimage

我正在使用 ImageIO 和 JAI,并且想要将字节数组读入 BufferedImagebyte[] 包含 JP2000 编码图像的数据,它相当大,大约 100MB。我目前正在做类似的事情:

byte[] imageDataBytes = ...
InputStream imageStream = new ByteArrayInputStream(imageDataBytes);
BufferedImage imageData = ImageIO.read(imageStream);

每次调用 read() 时,ImageIO 似乎都会创建一个新的 BufferedImage

问题:

有没有办法告诉 ImageIO 读取图像字节数据并将其解码为预先分配的可变 BufferedImage

我在 Javadocs 中进行了一些搜索,发现 BufferedImage 将其数据存储在 Raster 对象中,该对象将其数据存储在 DataBuffer 中> 对象。因此,我知道现有的任何解决方案在技术上都不会写入 BufferedImage,而是直接写入 DataBuffer

了解所有图像的大小相同可能会有所帮助:大约 10,000 x 10,000,因此读取图像与缓冲图像不对齐不会出现任何问题。最终,我希望有一个缓冲图像、光栅或数据缓冲区的对象池,并在每次使用 ImageIO 读取时从池中借用。像这样的伪代码:

InputStream imageStream = new ByteArrayInputStream(imageDataBytes);
WritableRaster raster = ObjectPool.getAvailableRaster();
ImageIO.readToRaster(imageStream, raster);
BufferedImage imageData = new BufferedImage(raster);

我确信有一个简单的解决方案。任何帮助将不胜感激!

最佳答案

是的,您可以set the destination image ImageReadParam 对象的。但是,有一个警告:BufferedImage 必须具有与正在加载的图像匹配的 ColorModel 和 SampleModel。

我不确定 JPEG2000 图像,但常规 JPEG 通常是 RGB 图像,因此 TYPE_INT_RGB 的图像应该足够了:

BufferedImage image = new BufferedImage(10000, 10000,
    BufferedImage.TYPE_INT_RGB);

while (bytesAvailable) {
    byte[] imageDataBytes = getImageBytes();

    try (InputStream in = new ByteArrayInputStream(imageDataBytes);
         ImageInputStream stream = ImageIO.createImageInputStream(in)) {

        ImageReader reader = ImageIO.getImageReaders(stream).next();
        reader.setInput(stream);

        ImageReadParam param = reader.getDefaultReadParam();
        param.setDestination(image);

        reader.read(0, param);
    }
}

关于Java ImageIO 将图像 byte[] 读取到预分配的 BufferedImage 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67491036/

相关文章:

java 两个线程操作同一个数组

c# - 如何在运行时在 Xamarin.Forms 中动态更改图像的位置(x 和 y)?

java - Netbeans ImageIcon 不显示

java - facescontext.getcurrentinstance 返回 nullpointerexception

ios - 在 Swift 中从 Firebase 读取多个子节点

java - 无法使用用于执行 Java 程序的 Linux 脚本

java - "array initializer needs an explicit target-type"- 为什么?

css - 通过 content 属性替换图像集并在悬停时显示另一个图像

java - 在 netbeans 中运行时,tomcat 8.0 出现错误

java - 如何在条件下使用java8流filter()方法?