繁体   English   中英

用Java读取大tiff图像的最快方法是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM