如何快速将BufferedImage转换为byte []?

时间:2012-08-15 14:04:18

标签: java optimization bufferedimage

我需要将BufferedImage转换为byte[],但速度太慢了。该字节最终被base64编码并发送到android客户端。我一直在使用的方法是这样的:

public static byte[] ImageToBytes(BufferedImage im) throws IOException
{

//make sure its NN
if(im!=null)
{

//create a ByteArrayOutputStream
ByteArrayOutputStream baos = new ByteArrayOutputStream();

//write our image to it
ImageIO.write( im, "png", baos );

//flush the stream
baos.flush();

//get the image in byte form
byte[] imageInByte = baos.toByteArray();

//close the stream
baos.close();

//return our value encoded in base64
return imageInByte;

}

return null;
}

这对我的程序来说太慢了。将png更改为jpeg会使其在移动端失败。 JpegCodec版本在移动端也失败了。如果失败,我的意思是Android方法BitmapFactory.decodeByteArray()会返回null

2 个答案:

答案 0 :(得分:1)

转换为byte []是一个选项吗?你说“[它]最终是base64编码并发送到Android客户端”。包装OutputStream以写入Base64OutputStream之类的Android客户端并完全避免这个问题呢?

答案 1 :(得分:1)

你不会说为什么它太慢而且没有太多可以做的事情来使这段代码更快,因为它是转换{{1的唯一方法到PNG字节流。但这里有一些指示:

  1. BufferedImage已同步,这会耗费大量性能。您可以在Commons IOByteArrayOutputStream

  2. 中找到更快的实施方式
  3. 根据图片的大小,org.apache.commons.io.output.ByteArrayOutputStream的分配算法可能会出现问题。从初始大小1或10 KiB开始。

  4. ByteArrayOutputStream为您提供现有缓冲区的副本。如果你不需要(通常,你不会),编写你自己的toByteArray()可能会给你一个额外的速度提升(更不用说避免GC运行)