【问题标题】:How to read a TIFF file by tiles with Java?如何使用 Java 读取 TIFF 文件?
【发布时间】:2014-11-26 03:47:19
【问题描述】:

假设我有一个非常大的 TIFF 图像作为输入。由于我必须遵守内存规范,我无法完全加载此图像。所以以下不是一个选项:

BufferedImage data = ImageIO.read(image);

是否有任何 Java 库允许读取图像的特定部分而不缓冲整个图像?或者一些从流中获取 TIFF 切片的方法?

【问题讨论】:

    标签: java tiff java-io jai


    【解决方案1】:

    作为@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 格式逐块读取图像可能是实现您所要求的最有效的方法。 :-)

    【讨论】:

      【解决方案2】:

      本机 Java 库无法读取其组件中的 Tiff 文件....因此,您要么使用外部库,要么构建自己的库。

      @Joop 提供了一个指向我不知道的本地 Java 库的链接(了解您的工具!)如果您无法在那里找到所需的完整支持,您可能会发现以下内容很有用:

      Tiff 文件的规范并不复杂。我会考虑为它编写自己的文件阅读器。

      Java JAI 看起来对读取和解析 TIFF 文件具有显着扩展的支持。考虑:

      【讨论】:

      • 我猜 OP 已经在使用 JAI 或类似的东西,但以防万一.. 而不是编写自己的阅读器(这很有趣,但需要一些时间),您可以使用 @987654327 @。 :-)
      【解决方案3】:

      ImageIO 可以为您提供 Tiff 的 ImageReader,然后您可以使用readTile。 ImageIO 有几个getImageReadersBy... 方法。

      我不知道 ImageIO 是否支持 tiff,但 ImageIO 使用 java SPI,因此可以插入 ImageReaders 和 ImageWriters。

      事实上,这是read 的捷径,其中ImageReadParam 配置为瓷砖。

      从未使用过瓷砖,但看到之前的答案,我想指出这个选项。

      【讨论】:

      • 我使用过磁贴,但使用了不同的语言,从未意识到 API 可以直接容纳它,我以为我知道 API...嗯,谢谢你的课程。
      • @rolfl 嘿嘿,不知道有没有支持tiff,可能是通过JAI,所以你的链接不是没有价值的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多