如何使用Imagick合并和遮罩图像?

27

我对图像处理的知识非常有限,对使用的术语更是不了解,请耐心等待我的翻译。

基本上,我想要将两张图片合并在一起,其中一张将充当蒙版。那张图片看起来像这样:
Example
在现实中,蓝色和黄色背景都是透明的。

这张图片被用作常规照片的遮罩。需要将圆圈之外的部分“裁剪”(即使其变为不可见状态),而圆圈内部则保持可见。
因此,所有出现在蓝色区域的内容都是不可见的,所有出现在黄色区域的内容都是可见的。

老实说,我完全不知道该如何实现,所以任何帮助都将不胜感激!

编辑:
我使用的是 Imagick 的 API 版本,而不是命令行版本。

编辑:
为了让您理解我想要实现的效果,这里提供一个例子。

因此,输入图片如下:
enter image description here
这是遮罩图像,始终相同。

enter image description here
这是一个动态的示例图片。

enter image description here
这就是最终的效果。


我真的需要这个问题的答案。我的知识有限,无法自行研究,所以我开始了一个悬赏。如果问题需要改进,我很乐意这样做。 - Dennis Haarbrink
命令行版本会有帮助吗..? - Sudhir Bastakoti
如果API无法完成,我将不得不使用CLI,但我更偏向于使用API版本。 - Dennis Haarbrink
你想让最终的图像显示黑色边框吗? - user703016
@DennisHaarbrink 对不起,我的解决方案假设你的叠加层始终是一个黑色圆圈。它对彩色图像无效。我会尝试找到其他方法。 - user703016
@Cicada:这是一个不错的开始。当图像中几乎没有白色时,它运行得很好,但是如果有很多白色,它就会崩溃得很糟糕,非常糟糕。 - Dennis Haarbrink
4个回答

71

所以,最终,这将完成您需要的操作:

原始图像:

http://i.stack.imgur.com/b7seR.png

透明度遮罩:

enter image description here

叠加层:

http://i.stack.imgur.com/3ulkM.png

输出结果:

enter image description here

代码:

<?php
$base = new Imagick('U0R4F.png');
$mask = new Imagick('mask.png');
$over = new Imagick('3ulkM.png');

// Setting same size for all images
$base->resizeImage(274, 275, Imagick::FILTER_LANCZOS, 1);

// Copy opacity mask
$base->compositeImage($mask, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA);

// Add overlay
$base->compositeImage($over, Imagick::COMPOSITE_DEFAULT, 0, 0);

$base->writeImage('output.png');
header("Content-Type: image/png");

echo $base;
?>

我希望现在是正确的!注意:在你的示例中,看起来像是你缩小了基础图像,而我没有(我的目标只是展示遮罩的实现方式)。


1
太好了,这几乎完美!只有一个问题,原始图像中的任何透明度都会转换为黑色。有没有办法保留 alpha 通道? - Dennis Haarbrink
3
我需要进行一点微调,添加一个检查来确定图像是否具有 alpha 通道并使用不同的组合方法:if ($base->getImageMatte()) { $base->compositeImage($mask, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA); } else { $base->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0); } - Dennis Haarbrink
请原谅我的坚持,但如果您在赏金结束前不手动将声望奖励授予这些答案之一,那么其中一半将会流失。干杯。 - user703016
很抱歉,我无法颁发赏金,并且一直以为它会自动授予所选答案。 - Dennis Haarbrink
我还必须稍微修改以下这些行:$base->compositeImage($mask, \Imagick::COMPOSITE_DSTIN, 0, 0, \Imagick::CHANNEL_ALPHA); $base->compositeImage($over, \Imagick::COMPOSITE_DEFAULT, 0, 0, \Imagick::CHANNEL_ALPHA);但是,当我的掩模和叠加层同时为透明时,我无法去除黑色背景。 - Jason G
显示剩余4条评论

1

我已经找到了那个,但它并不能完全满足我的需求。那个答案的净效果是图像中的蓝色和黄色部分保持透明,而黑色边框显示“背景”图像。 - Dennis Haarbrink
很遗憾,您能否在帖子中附上原始图像呢?这样,我们就可以更好地了解您的起点。 - Justin T.
我已经更新了问题,并附上了样例输入和输出图片。 - Dennis Haarbrink

0

这并没有真正帮助到我。当然,我已经找到了compose函数,但我不知道如何结合可用的工具来创建我需要的结果。 - Dennis Haarbrink

0

这种掩蔽技术在ImageMagick Examples中使用了许多不同的技巧,如缩略图、掩蔽和绘画。 http://www.imagemagick.org/Usage/thumbnails/#mask_paint

但是请注意,遮罩和覆盖图像的边缘不应该匹配,否则可能会出现最好避免的边缘混叠效果。

可以使用形态学运算符将戒指的alpha掩蔽提取出来,并将其变细到中心线,以生成任意“环”形状的掩蔽。 ImageMagick Examples, Skeletons by Thinning, and Pruning http://www.imagemagick.org/Usage/morphology/#thinning_skeleton

Anthony Thyssen ImageMagick Examples的Web主管,也是ImageMagick的开发人员

附言:Elfling拍摄的照片很棒


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接