Java 绕过ImageIO.write';慢

Java 绕过ImageIO.write';慢,java,javax.imageio,raster,Java,Javax.imageio,Raster,我最近发现我使用的ImageIO库将图像写入字节数组/流的速度非常慢,并且从 BufferedImage img;//initialized elsewhere ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(img,"png",baos); 到 虽然第二种方法的速度快了近70倍,但我找不到从这个argb字节数组重新创建BuffereImage的快速方法。好吧,我不想说传递原始像素通常是一个好主意,

我最近发现我使用的ImageIO库将图像写入字节数组/流的速度非常慢,并且从

BufferedImage img;//initialized elsewhere
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img,"png",baos);


虽然第二种方法的速度快了近70倍,但我找不到从这个argb字节数组重新创建BuffereImage的快速方法。

好吧,我不想说传递原始像素通常是一个好主意,但它可能适合这个特定的用例

根据评论中的讨论,其难度应为:

DataBuffer buffer = new DataBufferByte(argb, argb.length); // arg is your input array
ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{8, 8, 8, 8}, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE);

return new BufferedImage(cm, Raster.createInterleavedRaster(buffer, width, height, width * 4, 4, new int[] {0, 1, 2, 3}, null), false, null);

假设
ARGB
数组中确实有ARGB像素,并且
宽度和
高度是已知的。使所有阵列和颜色模型保持不变以获得更好的性能

我认为将其读回类似于旧的impl不是一个选项?以前我使用ImageIO.read将其读回,但这取决于使用ImageIO.write编码的字节流。第二个代码示例中的字节数组只是所有像素值的转储,而不是编码的bytestream.wouldnt,这会使它成为一个简单的BMP吗?这样做应该是可能的——或者可能是这样——标准Java ImageIO PNG编写器速度慢似乎是一个常见的问题。试着在谷歌上搜索“fastpng解码器java”,你会发现一些替代品,比如objectplanet、fastpng和sixlegs。您是否尝试过编写其他格式(如BMP)?。在任何情况下,您都可以从原始像素重新创建图像(关于它的问题已经很多了),但您需要知道通常存储在文件格式头中的颜色、宽度、高度等。PS:只想指出,第二个数组中的代码不是像素的转储,而是像素。代码非常快,因为它只是一个单一的任务。您可以从这些像素创建新图像,但如果不进行复制(这需要更多的时间),对一个图像的更改将反映在另一个图像中。
DataBuffer buffer = new DataBufferByte(argb, argb.length); // arg is your input array
ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{8, 8, 8, 8}, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE);

return new BufferedImage(cm, Raster.createInterleavedRaster(buffer, width, height, width * 4, 4, new int[] {0, 1, 2, 3}, null), false, null);