您没有说您计划制作的图像有多大,但如果它们非常大,您可能会遇到一些问题。
首先,JPEG 被限制为 65536 x 65536 像素,因此如果您需要更大的尺寸,则需要 bigtiff 或 PNG 之类的东西。
其次,您可能需要大量内存来合成大图像。例如,在这台笔记本电脑上我可以运行:
$ time convert -size 50000x50000 tile:k2.jpg result.jpg
real 6m11.366s
user 1m19.671s
sys 0m20.836s
在大约 6m 内制作 50k x 50k 像素的 JPG。
convert 将在开始写入结果之前组装整个图像。如果您没有大量的 RAM,它将使用一个巨大的临时文件。如果我在处理过程中查看/tmp,我会看到:
$ ls -l /tmp
total 1199684
-rw------- 1 john john 20000000000 Dec 1 15:56 magick-9559WtN2jwPlvrMm
一个 20GB 的临时文件。那是 50000 * 50000 * 4 * 2,所以它正在制作一个 16 位、四通道的临时图像。因为convert 将所有时间都花在磁盘 IO 上,所以速度相当慢。
您可以考虑其他系统——libvips 是一个流式图像处理库,因此它可以执行这样的命令而无需制作完整的中间图像。我明白了:
$ time vips replicate k2.jpg result.jpg 35 25
real 0m13.592s
user 0m16.383s
sys 0m1.426s
$ vipsheader result.jpg
result.jpg: 50750x51200 uchar, 3 bands, srgb, jpegload
这是将k2.jpg 水平复制35 次,垂直复制25 次,以使图像略大于50k x 50k。它不会创建临时文件,并在大约 15 秒内完成。对于非常非常大的输出图像,它不会有任何问题——我经常处理 300,000 x 300,000 像素的图像(尽管显然不是 jpg 格式)。