[英]What is the fastest way to read a large tiff image in java?
我目前使用JAI库读取tiff图像,但是它是非常慢的大型tiff图像(我需要处理1GB左右的卫星图像)。 我需要从tiff图像中读取每个点的高度,然后对其进行相应的着色。
我正在通过创建PlanarImage
读取图像,并使用image.getData().getPixel(x,y,arr)
方法遍历每个像素。
向我建议一种实施解决方案的更好方法。
编辑:我发现了错误。我通过在for循环中调用image.getData()方法为每个像素创建图像的新栅格。仅创建一次栅格,然后在解决的循环中使用其getPixel()函数我的问题。
从PlanarImage.getData()
的JavaDoc中:
返回的Raster在语义上是一个副本。
这意味着对于图像的每个像素,您都将在内存中创建整个图像的副本...这不能提供良好的性能。
使用getTile(x, y)
或getTiles()
应该更快。
尝试:
PlanarImage image;
final int tilesX = image.getNumXTiles();
final int tilesY = image.getNumYTiles();
int[] arr = null;
for (int ty = image.getMinTileY(); ty < tilesY; ty++) {
for (int tx = startX; tx < image.getMinTileX(); tx++) {
Raster tile = image.getTile(tx, ty);
final int w = tile.getWidth();
final int h = tile.getHeight();
for (int y = tile.getMinY(); y < h; y++) {
for (int x = tile.getMinX(); x < w; x++) {
arr = tile.getPixel(x, y, arr);
// do stuff with arr
}
}
}
}
当加载到内存中时,一个1 GB的压缩映像可能约为20 GB +。 在Java中处理此问题的唯一方法是使用非常大的堆空间加载它。
您正在处理非常大的图像,而使其变得更快的最简单方法是使用速度更快的PC。 我建议您以合理的价格获得超频的i7 3960X http://www.cpubenchmark.net/high_end_cpus.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.