Java高级图像:如何从巨大的图像中获取图像布局?
我有两张巨大的图片,无法全部载入记忆。我知道图像是平铺的,类Java高级图像:如何从巨大的图像中获取图像布局?,java,tiles,javax.imageio,imaging,jai,Java,Tiles,Javax.imageio,Imaging,Jai,我有两张巨大的图片,无法全部载入记忆。我知道图像是平铺的,类ImageReader中的所有方法都为我提供了合理的非零返回值 getTileGridXOffset(int), getTileGridYOffset(int), getTileWidth(int)和 getTileHeight(int) 我现在的问题是,我只想读取一个磁贴,以避免使用ImageReader.readtTile(int,int,int)方法将整个图像加载到内存中。但是如何确定平铺坐标的有效值呢 在接口renderImag
ImageReader
中的所有方法都为我提供了合理的非零返回值
getTileGridXOffset(int),
getTileGridYOffset(int),
getTileWidth(int)
和
getTileHeight(int)
我现在的问题是,我只想读取一个磁贴,以避免使用ImageReader.readtTile(int,int,int)
方法将整个图像加载到内存中。但是如何确定平铺坐标的有效值呢
在接口renderImage
中有方法getNumXTiles()
和getNumYTiles()
,但从源创建渲染图像的所有尝试都会导致内存不足/java堆空间
错误
平铺坐标理论上可以是任何东西,我尝试了readtTile(0,-1,-1)
,这也适用于我测试的一些图像
我还试图获取这些图像的元数据,但没有找到任何关于图像布局的有用信息
有没有人可以告诉我如何在不必将整个图像读入内存的情况下获取平铺坐标的值?是否有另一种方法不需要ImageLayout
的实例
非常感谢您的帮助。首先,您应该使用
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
或者,如果您只想获得一个tile,那么显然不需要为循环使用双。:-)
注意:对于不支持平铺的ImageReader
s/图像,getTileWidth
和getTileHeight
方法将分别返回与getWidth
和getHeight
相同的结果
此外,readTile
API文档还说明:
如果参数超出范围,将抛出一个IllegalArgumentException
。如果图像未平铺,则值0、0将返回整个图像;任何其他值都将导致抛出IllegalArgumentException
这意味着您的示例,readtTile(0,-1,-1)
应始终抛出一个IllegalArgumentException
,而不考虑平铺。。。我怀疑一些实现可能会完全忽略平铺坐标,并给出整个图像
PS:renderimage
界面在理论上可以帮助您。但是它需要在ImageReader
中有一个特殊的实现。在大多数情况下,您只会得到一个普通的BufferedImage
(它实现了renderdimage
),并且是单个(1x1)磁贴
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
BufferedImage tile = reader.readTile(imageIndex, col, row);
// ...do more processing...
}
}