繁体   English   中英

在Python中调整大图片的大小(大于可用的RAM)

[英]Resize huge images in Python (bigger than available RAM)

我想将巨大的(1 TB)图像调整大小并分割为256x256像素的图块(Zoomify / OSM / Google Maps / XYZ模式)。 图像将采用BigTIFF或PSB(大文档格式或Photoshop Big)格式。

有哪些可用的库可以做到这一点? 我正在查看GDAL,但它产生的输出非常模糊,我无法将其设置为更好的插值方式。 理想情况下,我会考虑使用Lanczos插值器来完成此类任务。

是否有任何本机Python库或基于C的库的包装程序可以做到这一点? imagemagick的Python包装器可以做这种事情吗?

如果没有可用的Python库,我还将开放基于命令行的工具,可以使用Python自动执行这些工具。

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

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

$ 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个图块。 带有机械硬盘,使用固态硬盘可能更快。 文档中有一章介绍dzsave

它具有Python绑定 ,因此您还可以编写:

import pyvips

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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