2011-08-01 13 views
3

私が持っているものは、モザイクのような大きな画像にまとめて配置する必要のあるフレームが多数あります。画像の必要な位置は既知である。JavaでImageIOを使用してTIFFのタイル出力を作成します。

非常に多数の画像があるため、それらをすべてメモリに読み込むことは、最高でも実用的ではありません。

ここで、私はRenderedImage(具体的にはgetData(rect))のメソッドをオーバーライドして適切なデータを読み込んで返すことができました。

これはうまくいきますが、イメージライターは常にgetDataを呼び出し、データ行を要求しています。それは、代わりに個々のタイルを呼び出すImageWriterParamを変更することができるはずだと思うが、私は書き込み関数を試したときにまだgetDataから単一の行を呼び出します。

タイルを使用して、代わりにgetTileを呼び出すにはどうすればよいですか。これを使用しているとき、私はparam.setTilingMode(ImageWriteParam.MODE_EXPLICIT);setTiling(w,h,xoff,yoff);

を使用することができます

BufferedOutputStream bos=null; 
try { 
    bos = new BufferedOutputStream(new FileOutputStream(new File("test2.tiff"))); 

    ImageWriter writer =(ImageWriter) ImageIO.getImageWritersBySuffix("tif").next(); 

    ImageOutputStream ios=null 

    ios = ImageIO.createImageOutputStream(bos); 

    writer.setOutput(ios); 
    ImageWriteParam param = writer.getDefaultWriteParam(); 
    param.setTilingMode(ImageWriteParam.MODE_DEFAULT); 

    RenderedImage mosaic = new MosaicImage(imageFiles[]); 

    writer.write(null,new IIOImage(mosaic,null,null),param); 

    } catch (FileNotFoundException ex) { 

    } 

注しかし、writer.writeはまだ私のイメージでgetData(rect)を呼び出し、非常にうるさくw,hで指定されたサイズの矩形の呼び出すことはありません。それは、私がsetTiling(100,100,0,0);

を使用する場合は、1つは、それが画像からgetTileを呼び出さない場合でも、ことを期待する例えば

いくつかのランダムな量によって異なるサイズの長方形は(おそらく何かから来ている)を呼び出しますgetDataに渡されるRectangleは(0,0,100,100)である必要がありますが、代わりにRectangle(0,0,96,96)が渡されます。これは画像の幅の倍数ではありません。あなたがtileWidthプロパティとTileLengthフィールドの下でTIFF 6.0仕様にまで読めば任意のヘルプ

答えて

3

ため

おかげで、あなたはtileWidthプロパティは、この制限は改善し、16の倍数でなければなりません

テキストを検索します一部のグラフィックス環境では のパフォーマンスを実現し、JPEGなどの圧縮スキームを使用して互換性を向上させます。

また、TileLengthも同様です。 100x100は16で割り切れませんが、96x96があります。これは、TIFFエンコーダがあなたの要求をフルに満たすことを試みていると思います。

+0

これは素晴らしい探偵作品です。これは私が見ている奇妙な行動を説明しています。残念ながら、私が期待していたようにタイルで私のモザイクを書くことはできないが、助けてくれてありがとう。 – David

+0

右端タイルと下端タイルは、適合しないとパディングされていると見なされます。つまり、画像サイズがタイルサイズの倍数ではないことは問題ではありません。タイルサイズが128x128の645x645イメージがある場合、ファイルに6x6タイルがエンコードされ、スペースが無駄になりますが、完全に有効です。 – BitBank

関連する問題