50

如何从 BufferedImage 对象中获取 InputStream?我试过了,但 ImageIO.createImageInputStream() 总是返回 NULL

BufferedImage bigImage = GraphicsUtilities.createThumbnail(ImageIO.read(file), 300);
ImageInputStream bigInputStream = ImageIO.createImageInputStream(bigImage);

图像缩略图正在正确生成,因为我可以成功地将bigImage 绘制JPanel

4

3 回答 3

96

来自http://usna86-techbits.blogspot.com/2010/01/inputstream-from-url-bufferedimage.html

它工作得很好!

以下是为 BufferedImage 创建 InputStream 的方法:

URL url = new URL("http://www.google.com/intl/en_ALL/images/logo.gif");
BufferedImage image = ImageIO.read(url);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "gif", os);
InputStream is = new ByteArrayInputStream(os.toByteArray());
于 2011-03-04T14:15:39.020 回答
13

如果您尝试将图像保存到文件中,请尝试:

ImageIO.write(thumb, "jpeg", new File(....));

如果您只想要字节,请尝试执行 write 调用,但将其传递给 ByteArrayOutputStream,然后您可以从中取出字节数组并按照您的意愿使用它。

于 2009-03-16T03:52:35.303 回答
8

通过覆盖方法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());
于 2012-09-03T19:21:52.440 回答