我们说我有一个非常大的TIFF图像作为输入。由于我必须遵守的内存规范,我无法完全加载此图像。所以以下不是一个选项:
BufferedImage data = ImageIO.read(image);
是否有任何Java库允许在不缓冲整个图像的情况下读取图像的特定部分?或者从流中获取TIFF图块的一些方法?
答案 0 :(得分:6)
ImageIO可以为您提供Tiff的ImageReader,然后您可以使用readTile。
ImageIO有几种getImageReadersBy...
方法。
我不知道ImageIO是否支持tiff,但ImageIO使用java SPI,因此可以插入ImageReader和ImageWriters。
实际上,这是read
的快捷方式,其中为{tile设置了ImageReadParam
。
从未使用过瓷砖,但看到之前的答案,我想指出这个选项。
答案 1 :(得分:1)
本机Java库中无法读取其组件中的Tiff文件....因此,您无论是使用外部库还是构建自己的库都会遇到困难。
@Joop提供了一个我不知道的本地Java库的链接(了解你的工具!)如果你找不到所需的全部支持,你可能会发现以下内容:
Tiff文件的规范并不是非常复杂。我会考虑为它编写自己的文件阅读器。
Java JAI看起来已经显着扩展了对读取和解析TIFF文件的支持。考虑:
答案 2 :(得分:1)
作为@Joop答案的补充:
所有ImageIO ImageReader
实施都支持指定了源区域ImageReadParam
的{{1}},因此您只能提取整个图像的特定区域。这适用于任何读者,即使基础格式不支持平铺,也不管平铺TIFF(或其他格式支持平铺)的平铺大小。
示例:
ImageReadParam.setSourceRegion(rect)
也就是说,使用TIFF格式读取图像瓦片可能是实现所要求的最有效方式。 : - )