在Python中处理巨大(可能超30000x30000)的图像?

13 投票
5 回答
6106 浏览
提问于 2025-04-16 08:09

我正在尝试使用一个叫做 deepzoom.py 的 Python 脚本,把一些很大的图像(通常超过 1GB)转换成 Deep Zoom 图像格式(就像谷歌地图那种瓦片格式),但是这个脚本是基于 PIL 的,而 PIL 通常会因为内存限制而崩溃。这个脚本的作者说他正在研究 VIPS,但即使是 VIPS 的图形界面工具 nip2 也无法打开这些图像。在另一个相关的问题中,有人提到 OpenImageIO,看起来这个库有能力处理这个问题,并且有 Python 的接口,但没有提供合适的可执行文件,在 Windows 上编译它简直是一场噩梦。

有没有其他的 Python 库可以使用呢?我试过 PythonMagickWand(这是 ImageMagick 的一个接口)和 PythonMagick(这是 GraphicsMagick 的一个接口),但这两个也都遇到了内存问题。

5 个回答

2

我可以使用 pyvips 来读取大小为 (50000, 50000, 3) 的图片:

img = pyvips.Image.new_from_file('xxx.jpg')
arr = np.ndarray(buffer=img.write_to_memory(),
                  dtype=np.uint8,
                  shape=[img.height, img.width, img.bands])
2

听起来你想使用带有地理信息的图像,或者类似的东西,这种情况下,使用地理信息系统(GIS)会更合适。我推荐使用GDAL,这是一个非常棒的库,并且通过Swig提供了简单易用的Python接口。

在Windows上,最简单的安装方法是通过Frank Warmerdam的FWTools包。

3

我遇到过一个非常相似的问题,最后我用 netpbm 解决了这个问题,它在 Windows 上运行得很好。netpbm 可以轻松处理超大的 .png 文件,然后进行切割、裁剪、重新组合(使用 pamcrop、pamdice 和 pamundice),最后再转换回 .png,整个过程几乎不占用多少内存。我只需把需要的 netpbm 程序和 dll 文件放到我的应用里,然后从 Python 中调用它们就可以了。

撰写回答