我有一个mask.png:
和其他尺寸相同的png图片:
现在,我想使用mask.png遮罩图像,但仅在遮罩图像上颜色为黑色的情况下遮盖。
所需结果:
如果是的话,imagick是否有可能做到这一点?
答案 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');