私が持っているものは、モザイクのような大きな画像にまとめて配置する必要のあるフレームが多数あります。画像の必要な位置は既知である。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仕様にまで読めば任意のヘルプ
これは素晴らしい探偵作品です。これは私が見ている奇妙な行動を説明しています。残念ながら、私が期待していたようにタイルで私のモザイクを書くことはできないが、助けてくれてありがとう。 – David
右端タイルと下端タイルは、適合しないとパディングされていると見なされます。つまり、画像サイズがタイルサイズの倍数ではないことは問題ではありません。タイルサイズが128x128の645x645イメージがある場合、ファイルに6x6タイルがエンコードされ、スペースが無駄になりますが、完全に有効です。 – BitBank