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