web-dev-qa-db-ja.com

Java:BufferedImageからバイト配列へ、およびその逆

多くの人々が同様の問題を抱えていることがわかりますが、探しているものを正確に見つけることをまだ試みていません。

したがって、入力イメージを読み取り、それをバイト配列に変換するメソッドがあります。

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

今やりたいことは、それをBufferedImageに変換し直すことです(この機能が必要なアプリケーションがあります)。 「テスト」はバイト配列であることに注意してください。

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

ただし、これは次の例外を返します。

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

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

誰もこれを解決する方法について何か提案がありますか?大いに感謝します。

48
user1875290

これは、バイト配列に変換することをお勧めします

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

closeまたはflushを呼び出しても何も行われないことに注意してください。ソース/ドキュメントを見ると、これを自分で確認できます。

ByteArrayOutputStreamを閉じても効果はありません。

OutputStreamのflushメソッドは何もしません。

したがって、次のようなものを使用します。

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

サイズのヒントに関するリンクを次に示します。

7