在 Python 中调整大图像的大小(比可用 RAM 大)

Resize huge images in Python (bigger than available RAM)

我想调整大小并将巨大的 (1 TB) 图像拆分为 256x256 像素的图块(缩放/OSM/Google 地图/XYZ 架构)。图片将采用 BigTIFF 或 PSB(大型文档格式或 Photoshop Big)格式。

可以执行此操作的可用库有哪些?我正在查看 GDAL,但它产生的输出非常模糊,我无法将其设置为更好地进行插值。理想情况下,我会为此类任务寻找 Lanczos 插值器。

是否有任何本机 Python 库或基于 C 的库的包装器可以执行此操作? Python imagemagick 的包装器可以做这样的事情吗?

如果没有可用的 Python 库,我也愿意使用基于命令行的工具,我可以使用 Python.

将其自动化

libvips 可以有效地处理巨大的(大于 RAM)图像。它是一个流式图像处理库,因此它可以(在本例中)同时解压缩、调整大小、平铺和写入所有内容,而无需将整个图像放在内存中或需要任何临时文件。

dzsave 运算符将编写 DeepZoom / Zoomify / Google 地图金字塔。您可以像这样从命令行 运行 它:

$ vipsheader y.tif
y.tif: 104341x105144 uchar, 3 bands, srgb, tiffload
$ ls -l y.tif
-rw-r--r-- 1 john john 32912503796 Jun 13 13:31 y.tif
$ time vips dzsave y.tif x
real    3m4.944s
user    9m21.372s
sys 7m20.232s
peak RES: 640mb
$ ls -R x_files/ | wc
 227190  227172 2784853

所以在我的桌面上,它在大约 3 分钟内将 32GB 的图像转换为 230,000 个图块。这是机械硬盘,SSD 可能会更快。有一个chapter in the docs introducing dzsave

它有a Python binding,所以你也可以这样写:

import pyvips

image = pyvips.Image.new_from_file("y.tif", access="sequential")
image.dzsave("x")

access 选项告诉 libvips 它应该流式传输图像。它可以读取 BigTIFF 和 PSB。您会发现 BigTIFF 快得多,需要的内存也少得多。