【发布时间】:2013-09-26 23:45:31
【问题描述】:
我最近发现我正在使用的 ImageIO 库正在将图像写入字节数组/流的速度非常慢,并且从
BufferedImage img;//initialized elsewhere
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img,"png",baos);
到
BufferedImage img;//initialized elsewhere
byte[] argb = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
虽然第二种方法快了近 70 倍,但我找不到从这个 argb 字节数组重新创建 BufferedImage 的快速方法。
【问题讨论】:
-
我把它读回来类似于你的旧 impl 不是一个选项?
-
之前我使用 ImageIO.read 将其读回,但这取决于已使用 ImageIO.write 编码的字节流。第二个代码示例中的字节数组只是所有像素值的转储,而不是编码的字节流。
-
那会不会让它成为一个简单的 BMP 呢?这应该可以做这样的事情 - stackoverflow.com/questions/4234703/… 或者这个 - stackoverflow.com/questions/6319465/…
-
标准 Java ImageIO PNG 编写器速度慢似乎是一个常见问题。尝试用谷歌搜索“fast png decoder java”,你会发现一些替代品,比如 objectplanet、fastpng 和 Sixlegs。您是否尝试过编写另一种格式(如 BMP)?在任何情况下,您都可以从原始像素重新创建您的图像(已经有很多关于它的问题),但您需要知道通常存储在文件格式标题中的颜色模型、宽度、高度等信息。
-
PS:只是想指出第二个数组中的代码不是像素的转储,它是像素。代码非常快,因为它只是一个单一的任务。您可以从这些像素创建新图像,但如果您在不复制的情况下这样做(这需要更多时间),对一个图像的更改将反映在另一个图像中。
标签: java javax.imageio raster