3

TIFFに書き込むための大きなスイングコンポーネントがあります。コンポーネントが大きすぎてTIFFをメモリにロードできないため、ディスクベースのWritableRaster(ここで説明)に基づく大きなBufferedImageを作成するか、JAIを使用する必要があります。

プロジェクトの完全な混乱を除けば、JAIの方が良い答えのようです。

それを考えると、誰かが私のスイングコンポーネントをメモリを使い果たすことなくタイル状のTIFFに書き込むための手順を概説できますか?

画像サイズはおそらく10000x700になります

理想的には、ある種のディスクベースのイメージを作成し、コンポーネントの一部をそのイメージに書き込みます。各書き込みはディスクにフラッシュされます。

編集

ImageWriterでこれを行うことができると思いますが、次を呼び出すとNoSuchElementExceptionが発生します。

ImageWriter imageWriter = ImageIO.getImageWritersByFormatName("tif").next();

クラスパスにjai_code.jarとjai_core.jarjarがありますが、他に何かする必要がありますか?

編集 JAIを使用して非常に大きなTIFFを作成できますが、JAIはTIFF圧縮をサポートしていないため、ファイルは92MBです。

JAI-ImageIOをインストールすると、ImageWriterを使用して圧縮TIFFを作成できますが、メモリが不足しているRasterまたはBufferedImageからのみ作成できます。

2段階のアプローチを実行する方法はありますか?JAIを使用して大きなTIFFを作成し、すべてをメモリにロードせずに大きなTIFFを圧縮しますか?

4

2 に答える 2

2

JAI で大きな tiff (59392x40192px) を読み込んで保存する必要がありました。私の解決策は次のとおりです。

タイルとサブイメージが必要なため、TiledImage を使用しました。TiledImage を効率的に使用するには、好みのタイル サイズで構築する必要があります。JAI は TileCache を使用するため、イメージ全体が不要なときにメモリ内にあるわけではありません。

ファイルに TiledImage を書き込むには、オプション "writeTiled" を使用します (タイルごとに書き込むため、OutOfMemory を避けます)。

public void storeImage(TiledImage img, String filepath) {
    TIFFEncodeParam tep = new TIFFEncodeParam();
    //important to avoid OutOfMemory
    tep.setTileSize(256, 256);
    tep.setWriteTiled(true);
    //fast compression
    tep.setCompression(TIFFEncodeParam.COMPRESSION_PACKBITS);
    //write file
    JAI.create("filestore", img, filepath, "TIFF", tep);
}

まだテストしていない大きな画像の場合は、最大 690 MB (圧縮) の画像で問題なく動作します。

ただし、WinXP 32 ビットで作業している場合は、1280m のヒープスペース サイズを超えることができない場合があります。これは、依然として Java VM の制限です。

私の TiledImage は、画像ソース データからの IndexedColorModel を使用して構築されています。

//here you create a ColorModel for your Image
ColorModel cm = source.createColorModel();
//then create a compatible SampleModel, with the tilesize
SampleModel sm = cm.createCompatibleSampleModel(tileWidth,tileHeight);

TiledImage image = new TiledImage(0, 0, imageWidth, imageHeight, 0, 0, sm, cm);
于 2011-06-16T11:37:00.103 に答える
1

私は同じ状況にあり、次の手順を使用しました。

これは、TIFF 画像の表示と操作に役立ちました ~50MB (5000x5000px)。

于 2011-05-12T18:45:19.140 に答える