0

我需要将 a 转换BufferedImage为 a 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;
}

这对我的程序来说太慢了。更改pngjpeg使其在移动端失败。该JpegCodec版本在移动端也失败了。失败是指 Android 方法BitmapFactory.decodeByteArray()返回null.

4

2 回答 2

1

您不会说为什么它太慢了,也没有太多可以使此代码更快的方法,因为这是将 a 转换BufferedImage为 PNG 字节流的唯一方法。但这里有一些提示:

  1. 该类ByteArrayOutputStream是同步的,这会花费很多性能。您可以在Commons IO ( org.apache.commons.io.output.ByteArrayOutputStream)中找到更快的实现

  2. 根据图像的大小,分配算法ByteArrayOutputStream可能会出现问题。从 1 或 10 KiB 的初始大小开始。

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

于 2012-08-15T14:35:16.693 回答
1

转换为 byte[] 是一种选择吗?你说“[it] 最终被 base64 编码并发送到 android 客户端”。将 OutputStream 包装成类似Base64OutputStream的内容写入 Android 客户端并完全避免该问题怎么样?

于 2012-08-15T14:23:31.737 回答