PHP Imagick 剪贴蒙版导致暗光晕边缘

PHP Imagick clipping mask results in dark halo edges

我有两个 png 层,都具有透明背景,我正试图在 PHP 的 Imagick 中合并它们。一个是形状,另一个是要应用到该形状之上的反射。然而,反射是在形状边缘之外重叠绘制的,所以我需要将它们裁剪到形状上(移除不在形状内部的反射部分),然后在顶部分层并保留 alpha 通道。

我在网上能找到的所有例子都是这样做的;

$shape->compositeImage($reflections, \Imagick::COMPOSITE_DSTIN, 0, 0);

它适用于应用和裁剪反射,但会在反射的柔和边缘周围产生黑色“光晕”。我相信正在发生的事情是它给反射的软 alpha 边缘一个黑色背景,然后删除 alpha。但我需要“形状”作为反射的背景,因此反射的边缘 alpha 会融入后面的形状。

如何将反射应用到形状并将其夹在形状内部,而没有深色光晕?我尝试应用它然后将整个东西剪裁成原始形状。这使得反射效果很好,除了现在形状本身在边缘周围有一个黑色的光晕。所以我认为我只是错误地使用了掩码,但我无法弄清楚正确的方法是什么。

这是形状图片;

这是反射图像;

这是我目前从上面的代码中得到的;

我不太了解Imagick。所以这里是如何在 ImageMagick 命令行中执行此操作。将命令转换为 Imagick 应该相对容易。

基本上,您将两个图像的 alpha 通道分开,然后将它们相乘以使用 blob alpha 剪辑高光 alpha。然后将结果作为新的 alpha 通道放回高光图像中。然后将结果合成为 blob 图像上的新高亮图像。

convert blob.png highlight.png -alpha extract -compose multiply -composite new_highlight_alpha.png

convert highlight.png new_highlight_alpha.png -alpha off -compose copy_opacity -composite new_highlight.png

convert blob.png new_highlight.png -compose over -composite result.png

那么这个结果是你想要的吗?

根据 fmw42 的命令,我设法想出了以下 PHP 似乎做同样事情并且有效的代码;

//$shape is my first image, $reflection is my second image, as Imagick instances

//extract shape alpha channel
$shapeAlpha = clone $shape;
$shapeAlpha->separateimagechannel(\Imagick::CHANNEL_ALPHA);

//extract reflection alpha channel
$reflectionAlpha = clone $reflection;
$reflectionAlpha->separateimagechannel(\Imagick::CHANNEL_ALPHA);

//merge both alpha channels
$shapeAlpha->compositeImage($reflectionAlpha, \Imagick::COMPOSITE_MULTIPLY, 0, 0);
$combinedAlpha = clone $shapeAlpha;
    
//clip the reflection with the combined alpha channel
$reflection->setImageMatte(false);
$combinedAlpha->setImageMatte(false);
$reflection->compositeImage($combinedAlpha, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);

//apply the reflection to the shape
$shape->compositeImage($reflection, \Imagick::COMPOSITE_OVER, 0, 0);

//$shape is now the final composite image as intended, no dark halo