使用Java中的ImageIO编写TIFF的平铺输出

时间:2011-08-01 21:35:40

标签: java tiles tiff javax.imageio

我所拥有的是大量的帧需要放在一起放在一个更大的图像中(如马赛克)。所需的图像位置是已知的。

图像数量非常多,因此将它们全部加载到内存中是不切实际的。

基于其他一些答案,我可以覆盖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),它不是图像宽度或我能想到的任何其他东西。

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

如果您阅读了TileWidth和TileLength字段下的TIFF 6.0规范,您将找到文本

  

TileWidth必须是16的倍数。此限制会有所改善   某些图形环境中的性能并增强了兼容性   使用压缩方案,如JPEG。

和TileLength类似。 100x100不能被16整除,但96x96是,我敢打赌是TIFF编码器尽力满足你的要求。