Java 快速将图像转换为字节数组

Java 快速将图像转换为字节数组,java,image,Java,Image,我正在将图像对象转换为字节数组,如下所示: private byte[] getImageBytes() throws IOException { byte[] bytes; try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { ImageIO.write(copyImage(image), "png", baos); baos.flush(); bytes

我正在将图像对象转换为字节数组,如下所示:

private byte[] getImageBytes() throws IOException {
    byte[] bytes;
    try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
        ImageIO.write(copyImage(image), "png", baos);
        baos.flush();
        bytes = baos.toByteArray();
    }
    return bytes;
}

private BufferedImage copyImage(Image img) {
    BufferedImage copyOfImage = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_RGB);
    Graphics g = copyOfImage.createGraphics();
    g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
    return copyOfImage;
}
问题是,转换一个90KB的图像需要300毫秒以上的时间。如果图像大小约为1.2MB,则转换只需稍长时间(约450ms)。 我已经测量了copyImage方法的时间。只需要1毫秒左右。问题似乎在于ImageIO.write方法

您知道加快速度的方法吗?

在getImageBytes()中,您正在将图像压缩为PNG,这可能需要时间。您可以实现的最快ImageIO.write调用是

ImageIO.write(copyImage(image), "bmp", baos);

没有压缩的地方。尽管如此,ImageIO还是包含了一些图像格式的参考实现,这些格式不是为提高速度而设计的。

为什么每次调用
getImageBytes
时都要分配一个100K字节的数组,然后基本上忽略它,除非有错误?如果出现异常,是否确实要返回一个0数组?(为什么不在更高的层次上处理这个异常呢?)我更新了这个问题,让它看起来是怎样的。这样,如果
字节
无法填充,我将获得NPE。我只是想,如果我将初始化数组,那么它将节省时间。我认为初始化与新的赋值无关。使用值初始化新ByteArrayOutputStream也不会节省太多时间。您只能获得一个NPE,因为您正在吞咽异常-如果您使异常冒泡,您将永远无法从中获得NPE,因为
baos.toByteArray()
将永远不会返回null。不,初始化阵列并不能节省时间——它需要时间。您正在分配一个新阵列,然后在每一个成功的情况下,您只是让它被垃圾收集。谢谢。再次更新。您的ImageIO.write调用正在将数据压缩为PNG,这需要时间。将其更改为bmp可将时间缩短200毫秒。不幸的是,它会显著增加字节数组大小。但由于我在这一点上寻找速度,这是正确的答案。