我有两个png层,都有透明的背景,我正尝试在PHP的Imagick中组合它们。一个是形状,另一个是在该形状上应用的反射。然而,反射是在形状的边缘之外重叠绘制的,所以当在顶部分层时,我需要将它们剪切到形状上(删除不在形状内部的反射部分),并保留alpha通道。
我在网上找到的所有例子都是这样做的;
$shape->compositeImage($reflections, \Imagick::COMPOSITE_DSTIN, 0, 0);
它可以应用和剪裁反射,但它会在反射的柔和边缘周围产生黑色的“光晕”。我相信它正在发生的事情是给反射的柔和alpha边缘一个黑色的背景,然后删除alpha。但是我需要“形状”作为反射的背景,这样反射的边缘就会混合到后面的形状中。
如何在没有暗晕的情况下,将反射应用于形状,并将其剪切到形状内部?我试着应用它,然后在原始形状上裁剪整个东西。这使得反射可以很好地工作,除了现在图形本身在边缘周围有一个黑色的光晕。所以我认为我只是错误地使用了掩码,但我不知道正确的方法是什么。
这是形状图像;
这是反射图像;
这是我目前从上面的代码中得到的;
发布于 2021-06-04 09:57:41
从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
发布于 2021-06-04 08:27:18
我不太了解Imagick。下面是如何在ImageMagick命令行中执行此操作。将命令转换为Imagick应该相对容易。
基本上,您分离两个图像的alpha通道,然后将它们相乘,以使用斑点alpha裁剪高光alpha。然后将结果作为新的alpha通道放回高光图像中。然后将结果合成为斑点图像上的新高亮图像。
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
那么,这是您想要的结果吗?
https://stackoverflow.com/questions/67829996
复制相似问题