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

标签 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

最佳答案

你没有说为什么它太慢,也没有什么办法可以让这段代码更快,因为这是将 BufferedImage 转换为 PNG 字节流的唯一方法。但这里有一些提示:

  1. ByteArrayOutputStream是同步的,这会消耗大量性能。您可以在 Commons IO 中找到更快的实现(org.apache.commons.io.output.ByteArrayOutputStream)

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

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

关于java - 如何快速将 BufferedImage 转换为 byte[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11970736/

相关文章:

mysql - 如何优化 MySQL ORDER BY + 巨大的 LIMIT Offsets

Java,假3D效果

java - java bufferedImage 中的 RGB 图像转换二进制图像

java - 如何使用 getter 的返回值,使用反射?

java - Runnable 实现的类是什么样子的?

javascript - jquery/js 操作超过 2000 行时速度太慢

python - 创建一个 DataFrame,它由来自另一个的所有行对组成

java - 透明图像上的 ByteArrayOutput/InputStream

java - 如何从不同的数据源/格式创建对象

java - if条件中的return语句函数