使用 ImageMagick 在 canvas 上叠加多个不同大小的 PNG 图像

Overlaying multiple PNG images of different sizes on a canvas using ImageMagick

我想使用 ImageMagick 在透明 canvas 上叠加多个不同大小的 PNG 图像。首先,我创建了一个固定大小的透明 canvas,比如

convert -size 1500x1000 canvas:transparent PNG32:canvas.png

然后我遍历我的图像,以便将每个图像添加到 canvas

convert canvas.png nthimage.png -gravity Center -geometry xResxYres+xcoord+ycoord -composite canvas.png

这很好用,但我可能会叠加多达 10 张图片,并且我对数千个 n 元组图像执行此操作,因此我们将不胜感激更快的解决方案。所以我的问题是:我是否也可以一步完成此操作,而不是先创建 canvas 然后一次添加一个图像?

编辑:我在 macOS 10.15.7 上使用 ImageMagick 7.0.11-13。我在 python 脚本中 运行 ImageMagick,因此如果需要,可以生成包含输入文件列表的文件。具体来说,假设我的输入文件 file_1.pngfile_n.png 大小 A1xB1AnxBn 并且应该放置在坐标 +X1+Y1 到 [=18] =] 相对于 canvas 的中心,输出文件为 output.png,大小应为 1500x1000。

我真的不建议从 Python 中取出子进程来调用 ImageMagick 数千次。您最终会在每个图像中包含太多的进程创建开销,如果您已经 运行 Python 可以进行图像处理 “内部”[=24],那么这是毫无意义的=].

我建议你直接从 Python 使用 PIL 或 OpenCV,因为你的 Mac 肯定是多核的,我建议你也使用多处理,因为做的任务数以千计的图像是可以并行化的。

由于您没有真正说明您的元组实际是什么样子,也没有说明如何确定输出文件名,我只能向您指出 this 答案中的方法 7 和 8。

您对每个图像的处理函数将要创建一个新的透明图像,然后打开并粘贴其他图像:

from PIL import Image

canvas = Image.new('RGBA', SOMETHING)

for overlay in overlays:
    im = Image.open(overlay)
    canvas.paste(im, (SOMEWHERE))

canvas.save(something)

文档 here.