2013-03-14 9 views
39

多くの人が同様の問題を抱えていることがわかりましたが、私が探しているものを見つけようとしていません。Java:BufferedImageからバイト配列まで

だから、私は、入力画像を読み取り、バイト配列に変換する方法があります:私は今、何をしたいか

File imgPath = new File(ImageName); 
    BufferedImage bufferedImage = ImageIO.read(imgPath); 
    WritableRaster raster = bufferedImage .getRaster(); 
    DataBufferByte data = (DataBufferByte) raster.getDataBuffer(); 

を、それが戻ってBufferedImageに変換している(私はのためのアプリケーションを持っています私はこの機能が必要です)。 "test"はバイト配列であることに注意してください。

BufferedImage img = ImageIO.read(new ByteArrayInputStream(test)); 
    File outputfile = new File("src/image.jpg"); 
    ImageIO.write(img,"jpg",outputfile); 

しかし、これは次の例外を返します。バッファ画像のimgがnullであるため、

Exception in thread "main" java.lang.IllegalArgumentException: im == null! 

これがあります。私は、BufferedImageからバイト配列への私の元の変換では、情報が変更/失われ、データがもはやjpgとして認識されなくなるという事実と関係があると私は思う。

誰もこれを解決する方法に関する提案はありますか?大変に感謝します。

答えて

58

これはcloseまたはflushを呼び出すと、何もしないだろうことをバイト配列

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(img, "jpg", baos); 
byte[] bytes = baos.toByteArray(); 
+3

:ここ

ByteArrayOutputStream baos = new ByteArrayOutputStream(THINK_ABOUT_SIZE_HINT); boolean foundWriter = ImageIO.write(bufferedImage, "jpg", baos); assert foundWriter; // Not sure about this... with jpg it may work but other formats ? byte[] bytes = baos.toByteArray(); 

はサイズヒントに関するいくつかのリンクありなし –

+6

ここでjpgを使う特別な理由はありますか? – hguser

+1

close()が何もしなかった場合、flush()自体を呼び出すため、* before * toByteArray()を呼び出す必要があります。 – EJP

6

ノートに変換することをお勧めします、あなたはそれらのソース/ドキュメントを見て、自分のためにこれを見ることができます:

ByteArrayOutputStreamを閉じることは効果がありません。

OutputStreamのflushメソッドは何もしません。したがって

このようなものを使用:フラッシュと密接に行います