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 存储库上打开一个问题。
我目前正在尝试让 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 存储库上打开一个问题。