切片非常大的jpg地图图像,49000 * 34300像素

时间:2010-04-15 21:18:20

标签: java jai tiling

我想写一个mapviewer,我必须工作大地图图像文件的小瓷砖,并且需要平铺大图像,现在的问题是将大图像平铺到小瓷砖(250 * 250像素或像这样尺寸) 所以,我使用ImageMagic程序来做,但有问题 现在是进行平铺的任何其他编程方法或应用程序? 我可以用java中的JAI吗?如何?

6 个答案:

答案 0 :(得分:5)

你自己尝试过在Java中做过吗?我试过这个(警告,大图像,可能会崩溃浏览器,使用“另存为...”)this image。需要运行额外的内存(-Xmx400M)。

public class ImageTile {
    public static void main(String[] args) throws IOException {
        Dimension tileDim = new Dimension(250, 250);
        BufferedImage image = ImageIO.read(new File(args[0]));

        Dimension imageDim = new Dimension(image.getWidth(), image.getHeight());

        for(int y = 0; y < imageDim.height; y += tileDim.height) {
            for(int x = 0; x < imageDim.width; x += tileDim.width) {

                int w = Math.min(x + tileDim.width,  imageDim.width)  - x;
                int h = Math.min(y + tileDim.height, imageDim.height) - y;

                BufferedImage tile = image.getSubimage(x, y, w, h);
                ImageIO.write(tile, "JPG", new File("tile-"+x+"-"+y+".jpg")); 
            }
        }
    }
}

答案 1 :(得分:3)

对于像您这样的大尺寸图像,最好使用JPEG文件的无损编辑。这不仅更快,因为图像不需要渲染,但它也保留了质量,因为图像不会被重新压缩。

无损编辑适用于块,通常为16px square。虽然限制某些应用程序,但这似乎非常适合映射。您可以通过首先无损地将图像裁剪为大小的片段来实现不同缩放级别的平铺。 (由于图像未渲染,因此效率很快。)这为您提供了全缩放的图块。要创建较低级别的缩放,请合并2x2切片并将其缩小至1个切片的大小。下一级使用4x4瓦片,8x8等等,每次缩小到一个瓦片。在某些时候,当瓷砖的数量太大时,您可以选择使用缩放的瓷砖作为基础资源。例如,在缩放级别8,这将需要256x256个图块。这可能太难处理,因此您可以使用缩放级别4的16x16切片。

维基百科有关于无损编辑的more,以及一些实施库的链接。

答案 2 :(得分:0)

imagemagick使用-tile进行平铺。它更像是对图像的重复,但可能是有用的。因为你已经在使用它了。但是,如果你的意思是生成无缝拼贴,我不确定imagemagick是否可以这样做。

答案 3 :(得分:0)

GDAL附带了一个名为gdal2tiles.py的脚本,可以完全按照您的要求进行操作,包括格式化用于Google地图,OpenLayers等的切片。

似乎还有更新版本的GDAL2Tiles

答案 4 :(得分:0)

带有r树的megatexture如何有效访问?显然它可以使用128000x128000像素的图像。

答案 5 :(得分:0)

JAI依赖于平台,今天似乎是一个死的项目。

我建议使用开源程序 imagemagick 。虽然它依赖于平台,但它可以与JAI使用相同的平台,但具有完整的社区支持。

关于imagemagick的大图像的技巧是使用其“stream” - 命令而不是convert命令。 Stream仅读取图像的相关部分,并将提取的部分保存为原始数据。然后,您需要“转换”以将小原始数据保存为jpeg。

将大小为800x600的large.jpeg从位置0x0保存到tile.jpeg的示例:

    stream -extract 800x600+0+0 large.jpeg tile.rgb

    convert -depth 8 -size 800x600 rgb:tile.rgb tile.jpeg

(在Windows上运行时,请务必使用ImageMagick的convert.exe,因为有一个名为“convert”的Windows命令。)

仅使用TIFF图像时,apache Sanselan可能是正确的选择 - 它是一个纯java的成像库。此外,JAI似乎包含一个独立于TIFF的平台编解码器。