【问题标题】:Combine multiple images with same name合并多个具有相同名称的图像
【发布时间】:2019-01-09 10:34:01
【问题描述】:

我有一个名为“Images”的文件夹和一个名为“Mask”的文件夹。在“图像”文件夹中有 200 张图像,在“蒙版”文件夹中有 200 张同名图像(透明背景)。我现在想始终合并两张具有相同名称的图片,因此“图像”文件夹中的图像位于背景中。图像大小相同。

示例背景图片:

示例掩码:

我想它应该很容易用 imagemagick 实现,但我现在真的不知道这个程序和我找到的示例都更加复杂。

我尝试过类似的方法:

convert Images/*.png -draw "image over x,y 0,0 Mask/*.png" combined/*.png

不是因为路径的原因吗?我必须循环吗,还是有简单的方法?

谢谢

【问题讨论】:

  • 您在 Windows 上吗?还是一个像样的操作系统?请提供示例输入图像、掩码和输出图像以供测试。
  • @MarkSetchell 体面的一个 ;) Ubuntu 18.10
  • 如果您只使用一张图片,您的示例代码是否能达到您想要的效果?
  • @MarkSetchell我找到了一个使用其他命令的方法:)

标签: imagemagick image-manipulation


【解决方案1】:

由于您有很多图像,它会为您完成所有循环和文件名/目录拆分,我会像这样使用 GNU Parallel

mkdir -p combined
parallel 'convert {} Mask/{/} -composite combined/{/}' ::: Images/*png

parallel 非常小心并测试你打算做什么:

parallel --dry-run ...

首先确定。

{} 表示“当前参数”

{/} 表示“当前参数被剥离的目录部分”

:::表示参数的开始。


或者,您可以使用这样的循环:

#!/bin/bash

mkdir -p combined
cd Images

for f in *png; do
    convert "$f" ../Mask/"$f" -composite ../combined/"$f"
done

【讨论】:

  • 我刚刚找到了一个非常相似的解决方案。谢谢朋友。
【解决方案2】:

我终于找到了一个小 bash 脚本的方法:

#!/bin/bash

for entry in Images/*
do
  name="$(cut -d'/' -f2 <<<"$entry")"
  convert Cells/$name Mask/$name -composite combined/$name
done

【讨论】:

  • 酷 - 很高兴你让它工作了。顺便说一句,请考虑在从convert ... 开始的行上的每个"$name" 周围添加双引号,否则如果文件名中有空格,它将不起作用。
猜你喜欢
  • 2023-01-07
  • 2021-12-16
  • 1970-01-01
  • 2016-09-28
  • 2022-11-10
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2019-08-31
相关资源
最近更新 更多