Java 如何从BuffereImage获取InputStream?

Java 如何从BuffereImage获取InputStream?,java,image-processing,javax.imageio,Java,Image Processing,Javax.imageio,如何从BuffereImage对象获取InputStream?我尝试了这个方法,但是ImageIO.createImageInputStream()总是返回NULL BufferedImage bigImage = GraphicsUtilities.createThumbnail(ImageIO.read(file), 300); ImageInputStream bigInputStream = ImageIO.createImageInputStream(bigImage); 图像缩略图

如何从BuffereImage对象获取InputStream?我尝试了这个方法,但是ImageIO.createImageInputStream()总是返回NULL

BufferedImage bigImage = GraphicsUtilities.createThumbnail(ImageIO.read(file), 300);
ImageInputStream bigInputStream = ImageIO.createImageInputStream(bigImage);
图像缩略图正在正确生成,因为我可以成功地将bigImage绘制到JPanel


谢谢。

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

ImageIO.write(thumb, "jpeg", new File(....));
如果您只想读取字节,请尝试执行写调用,但要传递一个ByteArrayOutputStream,然后您可以从中取出字节数组,并根据需要对其进行处理。

From

它工作得很好

以下是您如何制作 BuffereImage的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());

通过重写方法
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,然后将其转换为ByteArrayInputStream完成了任务。但是我想知道为什么ImageIO.createImageInputStream()不起作用。它看起来希望传入的对象是一个文件(或者其他东西)。我以前没有使用过API。。。我不确定你想做什么:-)(我想我给你的是一个幸运的猜测,我给你的有用:-)我正试图将图像上传到服务器,这就是为什么我想从它创建一个InputStream。啊,看看输入-一个用作输入源的对象,比如文件、可读的RandomAccessFile或InputStream.Felipe。我试图找到一个来自没有扩展名的URL的图像的类型(gif、png、jpg等)。我找到了一个解决方法,但是当你将图像写入输入流ImageIO.write(图像,'gif',os);您已经提到了图像类型,我如何在不指定图像类型的情况下执行此操作。您必须指定一种类型。我想它不应该和输入一样。你可以从PNG中读取数据,也可以在JPEG上写入数据。这会不会复制数据,不是一次而是两次?首先是ImageIO.write将其写入ByteArrayOutputStream时,然后是调用toByteArray()时。这不仅是内存问题,也是CPU问题。@morpheus你说的有道理,那么实际可行的方法是什么呢?这样做并使用
IOUtils.copy(is,output)
buf会导致两倍的大小。因此,这似乎是一个非常糟糕的方法。我应该投反对票,但我不能再投了。类似的: