如何将BufferedImage转换为InputStream?

23

我正在使用Servlet上传图像。为了执行调整大小操作,我将InputStream转换为BufferedImage。现在我想将其保存在MongoDB中。因为我对MongoDB还不太了解,据我所知,GridFS需要InputStream。

那么,有没有办法将BufferedImage转换为InputStream?

4个回答

26

BufferedImageByteArrayOutputStreambyte[]ByteArrayInputStream

BufferedImage转换为ByteArrayOutputStream,再将其转换为byte[],最后转换为ByteArrayInputStream
使用ImageIO.write方法将BufferedImage(它是RenderedImage)转换成ByteArrayOutputStream。然后从中获取一个字节数组(byte[]),将其传入类型为ByteArrayInputStreamInputStream中。
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(buffImage, "jpeg", os);                          // Passing: ​(RenderedImage im, String formatName, OutputStream output)
InputStream is = new ByteArrayInputStream(os.toByteArray());

ByteArrayOutputStreamInputStream都实现了AutoCloseable接口。因此,您可以使用try-with-resources语法方便地自动关闭它们。


尝试了这个,第三行出现编译错误:“类型中未定义ByteArrayInputStream(byte[])方法”。这是什么意思? - Möoz
你是否正确导入了相关内容?构造函数是否正确?请参考以下链接:http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html#ByteArrayInputStream(byte[]) - Sorter
2
有没有地方需要关闭的?我不是故意刁难,只是不太清楚而已 ;) - Nicofisi
让您的IDE为您完成这项工作。 - Sorter
@Nicofisi ByteArrayOutputStreamInputStream都实现了AutoCloseable接口。因此,您可以使用try-with-resources语法方便地自动关闭这些资源,无论是否抛出异常。 - Basil Bourque
关闭ByteArrayInputStream/ByteArrayOutputStream没有任何效果。 - undefined

13

首先,您必须获取您的 "bytes":

byte[] buffer = ((DataBufferByte)(bufferedImage).getRaster().getDataBuffer()).getData();

然后使用 ByteArrayInputStream(byte[] buf) 构造函数来创建你的 InputStream;


有趣的是,尽管不够优雅,但这段代码片段比批准的代码更高效。 - Nikita Kobtsev
但值得注意的是,这仅适用于使用byte[]表示每个像素的图像。 - Nikita Kobtsev

12

13
为什么这是必要的?这样做不会在内存中加载额外的(大)字节数组吗? - djechlin
1
+1. 而这种方法不仅复制了数据一次,而是两次!一次是在写入 ByteArrayOutputStream 时,另一次是将其转换为字节数组时调用 toByteArray()。 - morpheus
你可以在下面找到代码。 - Sorter

4
通过重写toByteArray()方法,返回buf本身(不是拷贝),可以避免与内存相关的问题。这将共享相同的数组,而不是创建另一个正确大小的数组。重要的是使用size()方法来控制数组中有效字节的数量。
final ByteArrayOutputStream output = new ByteArrayOutputStream() {
    @Override
    public synchronized byte[] toByteArray() {
        return this.buf;
    }
};
ImageIO.write(image, "png", output);
return new ByteArrayInputStream(output.toByteArray(), 0, output.size());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接