我需要将 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
。
最佳答案
你没有说为什么它太慢,也没有什么办法可以让这段代码更快,因为这是将 BufferedImage
转换为 PNG 字节流的唯一方法。但这里有一些提示:
类
ByteArrayOutputStream
是同步的,这会消耗大量性能。您可以在 Commons IO 中找到更快的实现(org.apache.commons.io.output.ByteArrayOutputStream
)根据图像的大小,
ByteArrayOutputStream
的分配算法可能会出现问题。从 1 或 10 KiB 的初始大小开始。toByteArray()
为您提供现有缓冲区的副本。如果您不需要(通常不需要),编写自己的OutputStream
可能会给您带来额外的速度提升(更不用说避免 GC 运行)
关于java - 如何快速将 BufferedImage 转换为 byte[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11970736/