2009-03-16 8 views
35

BufferedImageオブジェクトからInputStreamを取得するにはどうすればよいですか?私はImageIO.createImageInputStreamしかし、これを試してみました()は常にNULLを返し、私は成功を収めてのJPanelbigImageをペイントすることができますので、画像のサムネイルが正しく生成されているBufferedImageからInputStreamを取得する方法は?

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

ありがとうございます。

答えて

10

あなたは、ファイルしようとする画像を保存しようとしている場合:

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

あなただけのバイトに書き込みコールをやってみたが、それをあなたがして出てバイト配列を取得することができますByteArrayOutputStreamを渡したい場合はあなたが望むものをそれのものとする。

+1

ありがとうございました。ByteArrayOutputStreamに書き込んだ後、ByteArrayInputStreamに変換すると、そのジョブが完了しました。しかし、私はなぜImageIO.createImageInputStream()がうまくいかないのだろうと思っています。 – fromvega

+0

これは、渡されたオブジェクトがFile(または他のもの)であることを期待しているようです。私は以前にAPIを使っていませんでしたが、あなたが何をしようとしているかはわかりません:-)(私があなたに与えたものが幸運に思えます:-) – TofuBeer

+0

アップロードしようとしていますそのイメージをサーバーに送信する必要があります。そのため、そのサーバーからInputStreamを作成する必要があります。 – fromvega

72

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

から、これは非常に正常に動作します!ここで

あなたはBufferedImageのため のInputStream作ることができる方法です。(コピーしない)buf自体を返す、方法toByteArray()をオーバーライドすることにより

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()); 
+2

私のために働いたcorrectlt :)ありがとう。 –

+0

フェリペ。私は、拡張子のないURLから来た画像のタイプ(gif、png、jpgなど)を見つけようとしていました。 ImageIO.write(image、 'gif'、os); ImageIO.write(image、 'gif'、os); ImageIO.write(image、 'gif'、os);画像タイプを指定しないとどうすればいいですか? – WowBow

+0

タイプを指定する必要があります。私はそれが入力と同じではないと思う。 PNGから読み込み、JPEGで書き込むことができます。 –

9

を、あなたはメモリ関連の問題を回避することができます。これは同じ配列を共有し、別の正しいサイズを作成しません。重要なことは、配列に有効なバイト数を制御するために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()); 
+0

これを行い、 'IOUtils.copy(is、output)'を使うと、 'buf'は倍精度になります。だから、それは非常に悪いアプローチのようです。私はdownvoteする必要がありますが、私はもうできません。 – Davidea

関連する問題