繁体   English   中英

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

[英]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字节流的唯一方法。 但这里有一些指示:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM