使用VIPS命令行将图像切割成瓦片

7

我有一张大Tiff图像,想要将其切割成512x512个瓷砖并写入磁盘。

过去我使用过ImageMagick,如下所示:

convert -crop 512x512 +repage image_in.tif image_out_%d.tif

但最近这个方法已经不起作用了,进程会因为内存不足而停止等问题。
在VIPS中是否有类似的命令?我知道它有一个CLI,但是我在文档中找不到例子或有用的解释,而且我还在努力弄清楚nip2 GUI的事情。感谢任何帮助。 :)
2个回答

12

libvips有一个操作符可以帮助您快速完成这项任务。尝试使用以下命令:

$ vips dzsave wtc.tif outdir --depth one --tile-size 512 --overlap 0 --suffix .tif

那是 DeepZoom writer 制作 tif 瓦片深度为 1 的金字塔。请查看 outdir_files/0 中的输出瓦片。有一个关于如何使用 dzsave 的文档章节

对我来说比 IM 快得多:

$ time convert -crop 512x512 +repage huge.tif x/image_out_%d.tif
real    0m5.623s
user    0m2.060s
sys     0m2.148s
$ time vips dzsave huge.tif x --depth one --tile-size 512 --overlap 0 --suffix .tif
real    0m1.643s
user    0m1.668s
sys     0m1.000s

其中huge.tif是一个10000×10000像素的未压缩RGB图像。此外,它可以在很少的内存中处理任何大小的图像。


是否可以为图块提供自定义名称,例如包括行和列或X/Y坐标?我在文档中没有看到这样的选项,但libvips对我来说是新的。 - John
在这个例子中,瓦片被命名为column_row.tif,这是你的意思吗? - jcupitt
是的,谢谢,这对我很有效。我的问题是关于在vips中是否可以像ImageMagick那样自定义瓦片名称。例如,是否可以包括X/Y坐标而不是行/列?我还想知道在重叠区域会发生什么,有些程序会对像素进行求和或“羽化”。我希望vips都不会做这些操作 - 也就是说,它只会重复原始值。 - John
dzsave输出DeepZoom / Google地图 / Zoomify / IIIF金字塔,因此您可以从这些命名约定中进行选择。重叠仅是在瓦片之间共享的像素,因此例如,具有重叠1的情况下,0_0瓦片中最右边的两列与1_0瓦片中最左边的两列相同。如果要使用不重叠的瓦片,请将重叠设置为0。 - jcupitt
感谢您的澄清。看起来这是一个非常有用的库。 - John

1
我遇到了同样的问题。似乎VIPS没有像上面那个来自imagemagick的内置命令,但是你可以通过一些脚本编写(Python代码片段)来实现这个功能:
for x in xrange(0, tiles_per_row):
    xoffset = x * tile_size
    for y in xrange(0, tiles_per_row):
        yoffset = y * tile_size
        filename = "%d_%d_%d.png" % (zoom, x, y)
        command = "vips im_extract_area %s %s %d %d %d %d" % (base_image_name, filename,  xoffset, yoffset, tile_size, tile_size)
        os.system(command)

然而,您将无法获得与imagemagick裁剪相同的速度...


顺便提一下,我发现在这种情况下,基本的GraphicsMagick比ImageMagick表现更好,特别是如果你调整了memlimit和文件写入选项(抱歉,我现在记不清楚我最终使用了哪个选项)。 - Nicholas McCarthy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接