13

こんにちは、メモリ内に BufferedImage インスタンスがあり、それを byte[] に変換して、パフォーマンスを考慮して I/O 操作なしで base64 文字列としてエンコードしたいと考えています。次の API を使用していました。

ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ImageIO.write(image,"png",baos);
return baos.toByteArray();

ただし、この API は引き続き暗黙的にイメージを OS 一時ディレクトリに書き込みます。これは、基盤となる OS 一時ディレクトリがいっぱいで一時ファイルを作成できない場合に失敗につながります。スタックトレース:

Caused by: java.io.IOException: No space left on device
    at java.io.RandomAccessFile.write(RandomAccessFile.java:493)
    at javax.imageio.stream.FileCacheImageOutputStream.write(FileCacheImageOutputStream.java:134)
    at javax.imageio.stream.ImageOutputStreamImpl.write(ImageOutputStreamImpl.java:66)
    at com.sun.imageio.plugins.png.PNGImageWriter.write_magic(PNGImageWriter.java:376)
    at com.sun.imageio.plugins.png.PNGImageWriter.write(PNGImageWriter.java:1115)
    at javax.imageio.ImageWriter.write(ImageWriter.java:628)
    at javax.imageio.ImageIO.write(ImageIO.java:1480)
    at javax.imageio.ImageIO.write(ImageIO.java:1554)

I/O なしで変換を行う効率的な (メモリ内変換や効率的な I/O などの) 方法はありますか? お知らせ下さい。

4

4 に答える 4

12

ImageIO.setUseCache()メソッドを使用して ImageIO キャッシュを無効にします。

ImageIO.setUseCache(false);

javadoc によると、デフォルトでオンになっています。

ImageInputStreams および ImageOutputStreams の作成時にディスクベースのキャッシュ ファイルを使用する必要があるかどうかを示すフラグを設定します。

標準の InputStream> から読み取る場合、基になるストリームではデータの再読み取りが許可されないため、以前に読み取った情報をキャッシュに保存する必要がある場合があります。同様に、標準の OutputStream に書き込む場合、キャッシュを使用して、以前に書き込まれた値を最終的な宛先にフラッシュする前に変更できるようにすることができます。

キャッシュは、メイン メモリまたはディスク上に存在する場合があります。このフラグを false に設定すると、将来のストリームでディスクを使用できなくなります。これは、ファイルの作成と破棄のオーバーヘッドがなくなるため、小さな画像を扱う場合に有利です。

起動時に、値は true に設定されます。

于 2012-04-19T20:02:07.333 に答える
3

ストリームのみを使用する場合でも、ImageIO はデフォルトでそのキャッシュをディスクに書き込みます。次の方法でキャッシュを無効にしてみてください。

ImageIO.setUseCache(false);
于 2012-04-19T20:02:30.640 に答える
1

((DataBufferByte)img.getRaster().getDataBuffer()).getData()画像がバイト形式の場合、自動的にバイト配列を返します。IO はまったく必要ありません。

于 2012-12-14T23:33:46.573 に答える