70

多くの人が同じような問題を抱えているようですが、私はまだ探しているものを正確に見つけようとはしていません。

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

    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!

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

誰かがこれを解決する方法について何か提案がありますか?よろしくお願いします。

4

2 に答える 2

117

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

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
byte[] bytes = baos.toByteArray();
于 2013-03-14T16:11:28.323 に答える
12

電話をかけるcloseflush、何もしないことに注意してください。ソース/ドキュメントを見ると、これを自分で確認できます。

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

サイズのヒントに関するいくつかのリンクは次のとおりです。

もちろん、使用しているバージョンのソースコードとドキュメントを常に読んでください。SOの回答に盲目的に依存しないでください。

于 2014-02-28T10:49:03.260 に答える