绕过ImageIO.write的缓慢

时间:2013-09-19 04:05:03

标签: java javax.imageio raster

我最近发现我正在使用的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的快速方法。

1 个答案:

答案 0 :(得分:0)

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

根据评论中的讨论,它应该如下:

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像素,并且已知widthheight。使所有数组和颜色模型保持不变,以获得更好的性能。