我正在尝试使用名为deepzoom.py的python脚本将大型开销渲染(通常超过1GP)转换为Deep Zoom图像格式(即google maps-esque tile格式),但不幸的是它是由PIL驱动的,由于内存限制通常会导致崩溃。创建者说他正在钻研VIPS,但即使是nip2(VIPS的GUI前端)也无法打开图像。在其他人的另一个问题中(虽然在同一主题上),有人建议OpenImageIO,看起来它有能力,并且有Python包装器,但没有提供任何正确的二进制文件,并试图编译它在Windows上是一场噩梦。
我可以使用Python的替代库吗?我已经尝试过PythonMagickWand(ImageMagick的包装器)和PythonMagick(GraphicsMagick的包装器),但是这两个也遇到了内存问题。
答案 0 :(得分:3)
我有一个非常类似的问题,我最终通过使用netpbm解决它,它在Windows上工作正常。 Netpbm在转换巨大的.png文件然后切片,裁剪,重新组合(使用pamcrop,pamdice和pamundice)并转换回.png而不使用大量内存时没有问题。我刚刚在我的应用程序中包含了必要的netpbm二进制文件和dll,并从python中调用它们。
答案 1 :(得分:1)
听起来您正在尝试使用地理配准图像或类似的东西,因为GIS解决方案听起来更合适。我使用GDAL - 它是一个优秀的库,并通过Swig提供易于使用的Python绑定。
在Windows上,安装它的最简单方法是通过Frank Warmerdam的FWTools软件包。
答案 2 :(得分:1)
libvips附带一个非常快的DeepZoom创建器,可以处理任何大小的图像。尝试:
$ vips dzsave huge.tif mydz
将瓷砖写入mydz_files
并为您编写mydz.dzi
信息文件。它通常比deepzoom.py
快10倍,并且没有大小限制。
有关dzsave
的介绍,请参阅this chapter in the manual。
答案 3 :(得分:1)
我可以使用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])
答案 4 :(得分:0)
部分负载有用吗?如果您使用PIL并且图像格式为.BMP:您可以打开()图像文件(不加载它),然后执行裁剪(),然后加载 - 这只会实际加载图像的一部分您通过裁剪选择的。可能也适用于TGA,甚至可能适用于JPG,而且对PNG和其他格式效率较低。