pyvips 中的奇怪行为,无法写入一些图像

Strange behavior in pyvips, impossible to write some images

我目前正在尝试让 pyvips 为一个项目工作,在该项目中我需要处理尺寸在 1920x1080 和 40000x40000 之间的“大但仍然合理”的图像。

安装运行良好,但这些特定的 2 行有时有效,有时无效。

img = pyvips.Image.new_from_file('global_maps/MapBigBig.png')
img.write_to_file('global_maps/MapTest.png')

似乎对于最大的图像,我在回写图像时收到以下错误消息(加载正常):

pyvips.error.Error: unable to call VipsForeignSavePngFile

pngload: arithmetic overflow

vips2png: unable to write to target global_maps/MapFishermansRowHexTest.png

我说它似乎是因为以下几行工作得很好(大小为 100 000 x 100 000,比有问题的图像大得多):

size = 100000
test = pyvips.Image.black(size, size, bands=3)
test.write_to_file('global_maps/Test.png')

我到处都找不到答案,你知道我做错了什么吗?


编辑: 这是一个 link 到一个 image that does not work (它重 102 Mo)。

此图像是使用 pyvips 和缩小 40 倍的图像创建的,这样:

img = pyvips.Image.new_from_file('global_maps/MapNormal.png')
out = img.resize(40, kernel='linear')
out.write_to_file('global_maps/MapBigBig.png')

并且可以使用paint3D或gimp读取。

我在 libspng 中找到了您的错误消息:

https://github.com/randy408/libspng/blob/master/spng/spng.c#L5989

如果解压缩的图像大小超过您的进程指针大小,它似乎会被触发。如果我在 Windows 上尝试 32 位 libvips,我会看到:

$ ~/w32/vips-dev-8.12/bin/vips.exe copy MapFishermansRowHexBigBig.png x2.png
pngload: arithmetic overflow
vips2png: unable to write to target x2.png

但是 Windows 上的 64 位 libvips 工作正常:

$ ~/vips-dev-8.12/bin/vips.exe copy MapFishermansRowHexBigBig.png x.png
$

所以我认为切换到 64 位 libvips 构建可能会解决您的问题。当然,您还需要 64 位 python。

我还认为这可能是一个 libspng 错误(或功能不当?),因为只要您不尝试一次读取所有图像,您就可以在 32 位计算机上读取 >4gb 的图像(libvips 读取成块,所以应该没问题)。我将在 libspng 存储库上打开一个问题。