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

使用Java中的ImageIO编写TIFF的平铺输出,java,tiles,tiff,javax.imageio,Java,Tiles,Tiff,Javax.imageio,我所拥有的是大量的帧,它们需要放在一起形成一个更大的图像(比如马赛克)。图像的所需位置是已知的 有大量的图像,因此将它们全部加载到内存中充其量是不切实际的 基于这里的一些其他答案,我能够覆盖RenderImage中的方法(特别是getData(rect)),以加载适当的数据并返回它 这很好,但是图像编写器总是调用getData并请求数据行。在我看来,我应该能够将ImageWriterParam改为调用单个分幅,但是当我尝试使用write函数时,仍然从getData调用一行 我如何强制它使用til

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

有大量的图像,因此将它们全部加载到内存中充其量是不切实际的

基于这里的一些其他答案,我能够覆盖RenderImage中的方法(特别是
getData(rect)
),以加载适当的数据并返回它

这很好,但是图像编写器总是调用
getData
并请求数据行。在我看来,我应该能够将ImageWriterParam改为调用单个分幅,但是当我尝试使用write函数时,仍然从
getData
调用一行

我如何强制它使用tiles并调用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)
设置平铺(w、h、xoff、yoff)

但是,当使用此功能时,
writer.write
仍会在我的图像中调用
getData(rect)
,而且非常令人烦恼的是,它不调用由
w,h
指定大小的矩形。它调用一个大小随机不同的矩形(可能来自某个东西)

例如,如果我使用
setTiling(100100,0,0)

即使它没有从图像中调用getTile,传递给getData的矩形也应该是(0,0100100),但它传递的矩形(0,0,96,96)不是图像宽度的倍数或我能想到的任何其他值


感谢您提供的帮助

如果您阅读了TIFF 6.0规范中的“波浪宽度”和“波浪长度”字段,您将找到文本

波浪宽度必须是16的倍数。这一限制有了改进 在某些图形环境中提高性能并增强兼容性 使用压缩方案,如JPEG


和波浪长度相似。100x100不能被16整除,但96x96是,我打赌TIFF编码器会尽力满足您的要求。

哇,很棒的侦探工作,这解释了我看到的奇怪行为。不幸的是,这也意味着我不能像我所希望的那样用瓷砖来写马赛克,但谢谢你的帮助。如果右边和底边的瓷砖不合适,则假定它们是填充的。换句话说,图像大小不是平铺大小的精确倍数不是问题。如果您有一个分幅大小为128x128的645x645图像,则文件中将编码6x6分幅,并浪费一些空间,但这是完全有效的。