使用 ImageMagick 在已经具有透明度的图像上应用渐变蒙版?

Apply gradient mask on image that already has transparency with ImageMagick?

我有一张透明的 PNG 图片:

original.png

现在我想使用 ImageMagick 对其 alpha 通道应用对角渐变。我的意思是让它的不透明度保持在左上角,并逐渐淡出到右下角完全透明。像这样:

result.png

基本上我想生成一个渐变,并将其用作图像的遮罩。但是图像已经有自己的 alpha 通道(透明度)。这是我正在尝试的可视化:

(原始和结果显示在棋盘上以提高可见度,但我指的是实际透明度)

我想我了解如何生成对角渐变(barycentric gradient 命令对此非常有用)。但这会在 颜色通道 中创建一个渐变,即彩色或灰度渐变。而我想在 alpha 通道上应用渐变。

IM manual 我了解到 -compose CopyOpacity 运算符可用于此。然而,这似乎是 copy 蒙版中的 alpha 到我的图像上。我需要在我现有的 alpha 通道上 "apply" 这种渐变颜色,所以基本上我需要我的图像的 alpha 通道与渐变图像的灰度颜色 相乘

执行上面显示的操作的正确 IM 命令行是什么?

这是您可以做到的一种方法:

convert tree.png -write MPR:orig -alpha extract \
  \( +clone -colorspace gray -fx "1-j/h" \)     \
  -compose multiply -composite -write alpha.png \
  MPR:orig +swap -compose copyopacity -composite result.png

可以省略 -write alpha.png - 它仅显示用于调试和说明目的的 alpha 层。

MPR 只是我在使用 alpha 通道四处闲逛时保存在内存中的原始图像的临时副本,并在接近尾声时将其带回。 alpha 通道中的渐变由 -fx 生成,我首先将色彩空间设为灰色,因此只需 运行 一次,而不是三次。

如果你预先知道树图的尺寸,你可以将括号中的部分替换为:

-size WxH gradient:black-white

但我不知道前面的尺寸,我不想用第二个 convert 命令来获取它们,所以我基本上克隆原始图像的 alpha 通道以获得 canvas合适的尺寸并填写 -fx.