3

非常に大きな解像度で画像を作成する必要がありますが、画像は比較的「まばら」で、画像の一部の領域のみを描画する必要があります。

たとえば、次のコードで

/* this take 5GB memory */

    final BufferedImage img = new BufferedImage( 36000, 36000, BufferedImage.TYPE_INT_ARGB);

/* draw something */

    Graphics g = img.getGraphics();
    g.drawImage(....);

/* output as PNG */

    final File out = new File("out.png"); 
    ImageIO.write(img, "png", out); 

最後に作成した PNG 画像は 200 ~ 300 MB 程度しかありません。

問題は、最初に 5GB の BufferedImage を作成しないようにするにはどうすればよいですか? 大きな寸法の画像が必要ですが、色情報が非常にまばらです。

そんなに多くのメモリを消費しないように、BufferedImage のストリームはありますか?

4

2 に答える 2

1

遅延初期化マップまたは小さな BufferedImages でいっぱいの同様の構造を使用しない理由はありますか?

編集:これはかなり特殊なデータ構造です。画像全体に描画する場合は、適切な方法でそれらを並べて表示し、対応する AffineTransform をそれぞれに適用します。次に、コレクションを反復処理してそれぞれに描画し、それを無効にするか、直後に空白の場合は Flyweight することができます。ただし、Java内でそれらすべてをPNGに結合するための痛みのない方法は知りません。

于 2010-06-11T14:32:43.607 に答える
0

この例では、ピクセルあたり4バイトの画像タイプとしてTYPE_INT_ARGBを使用しています。画像の色数が限られている場合は、ピクセルあたりのバイト数が少ない別の画像タイプを使用できる可能性があります。

これにより、ピクセルあたりのバイト数を減らすことができますが、最良のシナリオはピクセルあたり1バイトであり、それでも1GB以上を使用します。

それ以外の場合は、レンダリングを複数の画像に分割し、それらを個別にマージすることを試みることができます。

于 2010-06-11T15:07:59.813 に答える