您也可以考虑libvips。它可以快速完成这种操作,而且不会占用太多内存。
我尝试了一个基准测试。在这台机器上使用 20,000 x 8,000 像素的 RGB PNG(四核 / 八线程 i7)。我明白了:
$ vipsheader big.png
big.png: 20000x8000 uchar, 3 bands, srgb, pngload
$ /usr/bin/time -f %M:%e convert big.png -crop 256x256 +repage +adjoin out_%d.png
2582228:61.78
$ echo out* | wc
1 2528 31754
%M:%e 表示显示峰值内存和经过的时间,因此需要 2.5gb 的 RAM 和 62s 的实时时间来制作 2528 个 PNG 切片。
libvips 有一个名为dzsave(DeepZoom 保存)的命令,它可以并行写入一组图块,并将图像流式传输而不是将整个内容加载到内存中。通过几个选项,您可以使其产生与 convert 命令相同的输出。
我明白了:
$ /usr/bin/time -f %M:%e vips dzsave big.png x --depth one --tile-size 256 --overlap 0 --suffix .png
161952:9.20
$ echo x_files/0/*.png | wc
1 2528 49450
所以 161mb 的内存和 9.2 秒的实时时间来制作相同的 2528 个文件。
文档中有一个章节是关于dzsave 解释如何使用它:
https://libvips.github.io/libvips/API/current/Making-image-pyramids.md.html
正如 Glenn 所说,大部分时间都花在 PNG 编码和解码上。 libpng 非常慢,它使用 deflate 压缩,甚至更慢。如果您改用 TIFF,它会变得更快:
$ /usr/bin/time -f %M:%e vips dzsave big.tif x --depth one --tile-size 256 --overlap 0 --suffix .tif
163476:1.34
现在只有 1.34 秒。 JPG 会更快(因为 IO 会更少),但我想这不适用于平面图。