我所拥有的是大量的帧需要放在一起放在一个更大的图像中(如马赛克)。所需的图像位置是已知的。
图像数量非常多,因此将它们全部加载到内存中是不切实际的。
基于其他一些答案,我可以覆盖RenderedImage中的方法(特别是getData(rect)
)来加载适当的数据并返回它。
这很好用,但是图像编写器总是调用getData
并请求数据行。在我看来,我应该能够改变ImageWriterParam来代替调用单个tile,但是当我尝试写入函数时仍然需要getData
中的一行。
如何强制使用tile并调用getTile。
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) {
}
注意我可以使用param.setTilingMode(ImageWriteParam.MODE_EXPLICIT);
和setTiling(w,h,xoff,yoff);
但是,在使用此功能时,writer.write
仍会在我的图片中调用getData(rect)
,并且非常烦人地不会调用w,h
指定大小的矩形。它调用的矩形大小相差一些随机量(可能来自某些东西)
例如,如果我使用setTiling(100,100,0,0);
可以预期,即使它没有从图像中调用getTile,传递给getData的Rectangle也应该是(0,0,100,100),而是传递Rectangle(0,0,96,96),它不是图像宽度或我能想到的任何其他东西。
感谢您的帮助
答案 0 :(得分:3)
如果您阅读了TileWidth和TileLength字段下的TIFF 6.0规范,您将找到文本
TileWidth必须是16的倍数。此限制会有所改善 某些图形环境中的性能并增强了兼容性 使用压缩方案,如JPEG。
和TileLength类似。 100x100不能被16整除,但96x96是,我敢打赌是TIFF编码器尽力满足你的要求。