【发布时间】:2014-11-26 03:47:19
【问题描述】:
假设我有一个非常大的 TIFF 图像作为输入。由于我必须遵守内存规范,我无法完全加载此图像。所以以下不是一个选项:
BufferedImage data = ImageIO.read(image);
是否有任何 Java 库允许读取图像的特定部分而不缓冲整个图像?或者一些从流中获取 TIFF 切片的方法?
【问题讨论】:
假设我有一个非常大的 TIFF 图像作为输入。由于我必须遵守内存规范,我无法完全加载此图像。所以以下不是一个选项:
BufferedImage data = ImageIO.read(image);
是否有任何 Java 库允许读取图像的特定部分而不缓冲整个图像?或者一些从流中获取 TIFF 切片的方法?
【问题讨论】:
作为@Joop 回答的补充:
所有 ImageIO ImageReader 实现都支持带有指定源区域 (ImageReadParam.setSourceRegion(rect)) 的 ImageReadParam,因此您只能提取整个图像的特定区域。这适用于任何阅读器,即使底层格式不支持平铺,也不管平铺 TIFF(或其他支持平铺的格式)的平铺大小。
例子:
ImageReader reader = ImageIO.getImageReaders(input).next();
reader.setInput(input);
ImageReadParam param = reader.getDefaultReadParam();
param.setSourceRegion(new Rectangle(x, y, w, h));
BufferedImage aoi = reader.read(0, param);
也就是说,使用 TIFF 格式逐块读取图像可能是实现您所要求的最有效的方法。 :-)
【讨论】:
本机 Java 库无法读取其组件中的 Tiff 文件....因此,您要么使用外部库,要么构建自己的库。
@Joop 提供了一个指向我不知道的本地 Java 库的链接(了解您的工具!)如果您无法在那里找到所需的完整支持,您可能会发现以下内容很有用:
Tiff 文件的规范并不复杂。我会考虑为它编写自己的文件阅读器。
Java JAI 看起来对读取和解析 TIFF 文件具有显着扩展的支持。考虑:
【讨论】:
ImageIO 可以为您提供 Tiff 的 ImageReader,然后您可以使用readTile。
ImageIO 有几个getImageReadersBy... 方法。
我不知道 ImageIO 是否支持 tiff,但 ImageIO 使用 java SPI,因此可以插入 ImageReaders 和 ImageWriters。
事实上,这是read 的捷径,其中ImageReadParam 配置为瓷砖。
从未使用过瓷砖,但看到之前的答案,我想指出这个选项。
【讨论】: