【问题标题】:Overlaying multiple PNG images of different sizes on a canvas using ImageMagick使用 ImageMagick 在画布上叠加多个不同大小的 PNG 图像
【发布时间】:2022-01-20 17:46:17
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 当然。你有一个包含输入图像名称列表的文件吗?并输出图像名称?几行是什么样的?你在运行什么操作系统?您运行的是哪个 IM 版本?
  • @MarkSetchell 感谢您回复我。我已经添加了一些说明。
  • 我还是不明白你的问题,抱歉。看起来相当模糊...... “数千个图像的 n 元组” 是什么?一个 n 元组的图像会产生一个输出图像吗?一个 n 元组的图像是什么样的?必须放置图像的 X、Y 坐标在哪里?输出文件名是如何确定的?
  • 数千个 n 元组图像我的意思是我想将 n 个图像合并一千次,因此欢迎任何速度改进。让我们举一个具体的例子。画布是 canvas.png,大小为 1500x1000,我有 3 张图像 1.png 2.png 3.png,大小为 300x200 600x400 900x600,我想将它们放置在相对于画布中心的坐标 +100-100 +200-200 +300-300 处。假设输出是output.png。我该怎么做?
  • 如果要合成多个输入图像,可以使用-page +X+Y 代替-geometry,然后使用-flatten。这样您就可以在一个命令行中合成多个图像,而无需使用多个 -composites。见legacy.imagemagick.org/Usage/layers/#flatten

标签: image-processing imagemagick png


【解决方案1】:

我真的不建议从 Python 中剥离子进程来调用 ImageMagick 数千次。您最终会为每个图像添加过多的进程创建开销,如果您已经在运行可以进行图像处理的 Python,这将毫无意义“内部”

我建议你直接使用 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

【讨论】:

  • 谢谢马克!这很有帮助。不幸的是,PIL 在质量方面的表现不如 IM,但确实快得多。
  • 嗯...我不明白这是怎么回事。您的输入和输出图像都是无损 PNG 文件,这两个包将逐位相同地保存,并且似乎没有任何可能引入差异的混合或计算,所以我不知道您是什么看到。不过,我很高兴你有一个解决方案,祝你的项目好运。
  • 我现在意识到,当所有图像都有一个 alpha 通道时,质量损失与一些困难有关。我使用了这里提出的方法stackoverflow.com/a/5324782/14130611 但是如前所述,这会导致质量损失。
猜你喜欢
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2014-07-01
  • 2011-05-26
  • 1970-01-01
相关资源
最近更新 更多