我正在使用Servlet上传图像。为了执行调整大小操作,我将InputStream转换为BufferedImage。现在我想将其保存在MongoDB中。因为我对MongoDB还不太了解,据我所知,GridFS需要InputStream。
那么,有没有办法将BufferedImage转换为InputStream?
我正在使用Servlet上传图像。为了执行调整大小操作,我将InputStream转换为BufferedImage。现在我想将其保存在MongoDB中。因为我对MongoDB还不太了解,据我所知,GridFS需要InputStream。
那么,有没有办法将BufferedImage转换为InputStream?
BufferedImage
➙ ByteArrayOutputStream
➙ byte[]
➙ ByteArrayInputStream
BufferedImage
转换为ByteArrayOutputStream
,再将其转换为byte[]
,最后转换为ByteArrayInputStream
。ImageIO.write
方法将BufferedImage
(它是RenderedImage
)转换成ByteArrayOutputStream
。然后从中获取一个字节数组(byte[]
),将其传入类型为ByteArrayInputStream
的InputStream
中。ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(buffImage, "jpeg", os); // Passing: (RenderedImage im, String formatName, OutputStream output)
InputStream is = new ByteArrayInputStream(os.toByteArray());
ByteArrayOutputStream
和InputStream
都实现了AutoCloseable
接口。因此,您可以使用try-with-resources语法方便地自动关闭它们。
首先,您必须获取您的 "bytes":
byte[] buffer = ((DataBufferByte)(bufferedImage).getRaster().getDataBuffer()).getData();
然后使用 ByteArrayInputStream(byte[] buf) 构造函数来创建你的 InputStream;
您需要使用ImageIO
类将BufferedImage
保存到ByteArrayOutputStream
中,然后从toByteArray()
创建一个ByteArrayInputStream
。
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());
ByteArrayOutputStream
和InputStream
都实现了AutoCloseable
接口。因此,您可以使用try-with-resources语法方便地自动关闭这些资源,无论是否抛出异常。 - Basil Bourque