【发布时间】:2021-08-02 01:44:51
【问题描述】:
我正在使用 ImageIO 和 JAI,并希望将字节数组读入 BufferedImage。 byte[] 包含 JP2000 编码图像的数据,它相当大,大约 100MB。我目前正在做类似的事情:
byte[] imageDataBytes = ...
InputStream imageStream = new ByteArrayInputStream(imageDataBytes);
BufferedImage imageData = ImageIO.read(imageStream);
似乎每次调用read() 时,ImageIO 都会创建一个new 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);
我确信那里有一个简单的解决方案。任何帮助将不胜感激!
【问题讨论】:
-
ImageIO 将其工作委托给 ImageReader(和 Writers)。所有这些都是细节丰富的。我会首先寻找字节数组和字节数组输入流的替代方案。并寻找 JPEG2000 ImageReader。
-
感谢您的回复,但是查看
read()方法的实现,它已经将字节流转换为图像阅读器。它的核心是调用一个抽象的 read() 方法,定义为:public abstract BufferedImage read(int imageIndex, ImageReadParam param)。有没有办法将已经实例化的BufferedImage或WritableRaster对象作为参数传递给read()方法? -
澄清一下,“核心”读取方法属于 ImageReader 对象,但它没有实现。
标签: java arrays image memory bufferedimage