为什么使用 ImageMagick convert 进行模糊处理会像宣传的那样工作?

Why does blurring using ImageMagick's convert work as advertised?

我的问题不是如何模糊图像的一部分,而是为什么以下语句正确工作。

convert rose: \( +clone -scale 5%  -scale 2000% \) \
\( +clone -gamma 0 -fill white \
-draw 'rectangle 20,10 40,20' -blur 10x4 \) \
-composite target.png

目前我的理解是第一部分

\( +clone -scale 5%  -scale 2000% \)

获取源图像,它最初是堆栈中唯一的图像,并将其复制到堆栈中,然后通过按 1/20 缩小然后放大 20/1 的顺序修改堆栈顶部。因此,堆栈顶部的图像与其下方的图像保持相同的分辨率。

下一个命令

\( +clone -gamma 0 -fill white \
-draw 'rectangle 20,10 40,20' -blur 10x4 \) \

再次复制顶部图像。因此,堆栈中现在有三个图像。 Gamma 设置为零的不寻常值,以绝对确定下一个填充白色的命令将填充 1.0、1.0、1.0 的纯 RGB。 -fill 命令实际上并没有做任何事情。它只是设置参数。实际的绘图操作由 -draw 命令执行。该命令绘制一个特定的图元(在本例中为矩形),并用白色填充它。绘制矩形后应用模糊滤镜。因此矩形本身不会发生太多事情。图像的其余部分将被该滤镜模糊。

接下来我迷路了。 -composite 运算符会将图像覆盖在堆栈顶部,覆盖堆栈中位于其下方的图像。但是由于我们在堆栈中有张图像,因此堆栈底部的图像将被忽略。想澄清一下吗?

我也想学习如何钓鱼而不是被提供一条鱼:man convert 指向 this 页面,但 "stack" 没有出现在该页面上。我应该从哪个参考页开始理解上面的简短 convert 片段?

首先,对于一些 "fishing lessons" 你可以阅读 here about command-line processing and order of commands etc. Also, have a look at Anthony Thyssen's excellent "Usage" pages here.

关于你的问题,解释是当栈上有三张图片时(你说的没错),第三张作为另外两张操作的掩码。解释 here.

进一步"fishing lesson"...如果您被ImageMagick困住了,您可以通过多种方式调试它...

技术一

删除命令的最后部分(创建输出文件的位,包括最后 -composite)并将其替换为这样的文件名:

convert rose:                          \
  \( +clone -scale 5%  -scale 2000% \) \
  \( +clone -gamma 0 -fill white -draw 'rectangle 20,10 40,20' -blur 10x4 \) \
  temp-%d.png

现在 运行 它,您将看到堆栈中的所有图像都失败了 temp-0.pngtemp-1.png

技巧二

在处理管道的各个阶段添加中间体 -writes

convert rose: \( +clone -scale 5%  -scale 2000% -write temp1.png \) \
 \( +clone -gamma 0 -fill white -draw 'rectangle 20,10 40,20' -blur 10x4 -write temp2.png \) \
...