[英]How can I quickly convert a BufferedImage to a byte[]?
我需要将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
。
会不会转换成一个byte []是一个选项? 你说“[它]最终是base64编码并发送到Android客户端”。 包装OutputStream以在Base64OutputStream之类的东西中写入Android客户端并完全避免这个问题呢?
您没有说为什么它太慢而且没有太多可以使这个代码更快,因为它是将BufferedImage
转换为PNG字节流的唯一方法。 但这里有一些指示:
类ByteArrayOutputStream
是同步的,这会花费很多性能。 您可以在Commons IO中找到更快的实现( org.apache.commons.io.output.ByteArrayOutputStream
)
根据图像的大小, ByteArrayOutputStream
的分配算法可能是个问题。 从初始大小1或10 KiB开始。
toByteArray()
为您提供现有缓冲区的副本。 如果您不需要(通常,您不需要),编写自己的OutputStream
可能会为您提供额外的速度提升(更不用说避免GC运行)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.