web-dev-qa-db-ja.com

BufferedImageからInputStreamを取得する方法は?

BufferedImageオブジェクトからInputStreamを取得するにはどうすればよいですか?私はこれを試しましたが、ImageIO.createImageInputStream()は常にNULLを返します

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

bigImageJPanelに正常にペイントできるため、画像のサムネイルが正しく生成されています。

ありがとうございました。

42
fromvega

画像をファイルに保存しようとしている場合:

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

バイトだけが必要な場合は、write呼び出しを試して、ByteArrayOutputStreamを渡してください。これにより、バイト配列を取得して、必要な処理を実行できます。

10
TofuBeer

から 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());
82
Felipe

メソッド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());
9
Igor