【问题标题】:Java Advanced Imaging: How to get the ImageLayout from a huge image?Java 高级成像:如何从巨大的图像中获取 ImageLayout?
【发布时间】:2016-08-09 16:51:49
【问题描述】:

我有几个巨大的图像无法全部加载到内存中。我知道图像是平铺的,ImageReader 类中的所有方法都为我提供了合理的非零返回值

getTileGridXOffset(int), getTileGridYOffset(int), getTileWidth(int)getTileHeight(int).

我现在的问题是我只想读取一个图块以避免使用ImageReader.readtTile(int, int, int) 方法将整个图像加载到内存中。但是如何确定瓦片坐标的有效值是什么?

在接口RenderedImage 中有getNumXTiles()getNumYTiles() 方法,但是所有从源创建渲染图像的尝试都会导致out of memory/java heap space 错误。

理论上,平铺坐标可以是任何东西,我尝试了readtTile(0, -1, -1),它也适用于我测试的一些图像。

我还尝试访问这些图像的元数据,但没有找到任何有关图像布局的有用信息。

有没有人可以告诉我如何在不必将整个图像读入内存的情况下获取图块坐标的值?还有另一种不需要ImageLayout 实例的方法吗?

非常感谢您的帮助。

【问题讨论】:

    标签: java tiles javax.imageio imaging jai


    【解决方案1】:

    首先,您应该使用isImageTiled(imageIndex) 检查有问题的ImageReader 是否支持给定图像的平铺。如果没有,您就不能指望其他方法提供有用的值。

    如果是这样,给定图像的所有图块的大小必须相等(但每列/最后一行中的最后一个图块可能会被截断)。这也是我所知道的所有平铺文件格式(即 TIFF)的情况。所以,利用这些知识,可以计算出两个维度的瓦片数量:

    // Calculate number of x tiles/y tiles:
    int cols = (int) Math.ceil(reader.getWidth(imageIndex) / (double) reader.getTileWidth(imageIndex));
    int rows = (int) Math.ceil(reader.getHeight(imageIndex) / (double) reader.getTileHeight(imageIndex));
    

    然后,您可以遍历磁贴索引(第一个磁贴始终为 0,0):

    for (int row = 0; row < rows; row++) {
        for (int col = 0; col < cols; col++) {
            BufferedImage tile = reader.readTile(imageIndex, col, row);
    
            // ...do more processing...
        }
    }
    

    或者,如果您只想获得单个图块,则显然不需要双 for 循环。 :-)


    注意:对于不支持平铺的ImageReaders/图像,getTileWidthgetTileHeight 方法将分别返回与 getWidthgetHeight 相同的值。

    另外,readTile API 文档说:

    如果参数超出范围,则抛出IllegalArgumentException。如果图像未平铺,则值 0、0 将返回整个图像;任何其他值都会导致IllegalArgumentException 被抛出。

    这意味着您的示例,readtTile(0, -1, -1) 应该始终抛出 IllegalArgumentException,而不管平铺如何...我怀疑某些实现可能会完全忽略平铺坐标,并且无论如何都会给您整个图像。


    PS:RenderedImage 接口可以在理论上帮助你。但它需要在ImageReader 中进行特殊实现。在大多数情况下,您只会得到一个普通的 BufferedImage(它实现了 RenderedImage),并且是一个 (1x1) 磁贴。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 2011-09-09
      • 2013-04-20
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      相关资源
      最近更新 更多