如何使用合成遮罩图像,但仅在黑色的情况下

时间:2019-01-29 08:10:26

标签: php imagick

我有一个mask.png:

mask

和其他尺寸相同的png图片:

image

现在,我想使用mask.png遮罩图像,但仅在遮罩图像上颜色为黑色的情况下遮盖。

所需结果:

desired result

如果是的话,imagick是否有可能做到这一点?

1 个答案:

答案 0 :(得分:1)

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

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

但是所讨论的遮罩已经具有一个活动的Alpha通道,因此可能存在透明的黑色值,并导致不良后果。

我建议将蒙版重建为新的Alpha颜色通道。也就是说,黑色-n-白色图像,其中黑色表示完全不透明的像素,而白色表示完全透明的像素。然后将重建的蒙版复制为新的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');

output.png