如何用复合材料遮盖图像,但仅在颜色为黑色的地方遮盖

How to mask an image with a composite but only where the color is black

我有一个 mask.png:

以及其他一些具有相同尺寸的 png 图像:

现在我想用 mask.png 遮罩图像,但仅限遮罩图像上颜色为黑色的地方。

想要的结果:

imagick 可以实现这样的功能吗?

这是一个非常棘手的问题。通常要隔离黑色,您只需应用 SCREEN 合成。

$image->compositeImage($mask, Imagick::COMPOSITE_SCREEN, 0, 0);

但是有问题的蒙版已经有一个活动的 alpha 通道,因此可能存在透明黑色值,并导致不良影响。

我建议将蒙版重建为新的 alpha 颜色通道。也就是说,黑白图像,其中黑色代表完全不透明的像素,白色代表完全透明的像素。然后将重建的遮罩复制为新的 alpha 通道。

// Load resources.
$image = new Imagick('input.png');
$mask = new Imagick('mask.png');
// Create a white canvas.
$tempMask = new Imagick();
$tempMask->newPseudoImage($mask->width, $mask->height, 'XC:WHITE');
// Copy mask over canvas to replace transparent values.
$tempMask->compositeImage($mask, Imagick::COMPOSITE_ATOP, 0, 0);
// Invert colors.
$tempMask->negateImage(true);
// Copy temporary mask as the new alpha channel.
$image->compositeImage($tempMask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);
// Save results.
$image->writeImage('output.png');