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