使用黑白蒙版遮罩 PNG 图像

我有下面的图像(请注意透明背景):

http://img2.mukewang.com/62ff419c0001674c05360591.jpg

我还有一个相同大小的黑白面具:

http://img4.mukewang.com/62ff41a40001e1ec05530553.jpg

我想“裁剪”这件衣服,只得到黑色圆圈中包含的第一幅图像的一部分。我尝试了许多不同的方法,但它们不起作用或太慢:

1) ImageMagick (commandline) <== 我可以使用哪个命令来实现此目的?我尝试乘法和复制不透明度,但它们不起作用

2)WideImage正在工作:但它需要超过12秒。$maskedImage = $source->applyMask($mask);

如果可能的话,我对ImageMagick解决方案感兴趣。



白衣染霜花
浏览 212回答 4
4回答

www说

您的 ImageMagick 版本似乎太旧,无法包含“copyalpha”撰写运算符。这是获得结果的另一种方法...convert&nbsp;dress.png&nbsp;\(&nbsp;circle.png&nbsp;-negate&nbsp;\)&nbsp;\ &nbsp;&nbsp;&nbsp;\(&nbsp;-clone&nbsp;0&nbsp;-transparent&nbsp;red&nbsp;+transparent&nbsp;red&nbsp;\)&nbsp;-insert&nbsp;0&nbsp;-composite&nbsp;result.png它会在主图像中读取,然后在蒙版图像中读取并否定它,然后创建一个透明层,并使用“-insert”将其移动到列表中的第一个位置。ImageMagick 对包含三个输入图像的“-composite”的默认处理是使用第三个图像(现在是带有黑色圆圈的图像)作为 Alpha 蒙版。你仍然需要“否定”那个面具,或者制作一个黑白倒置的新面具。用于创建透明画布的方法是在括号内读取其他图像之一,将红色所有内容更改为透明,然后将不红色的所有内容更改为透明。这将导致一个完全透明的画布用作复合列表中的第一个图像,即目标图像。

慕尼黑8549860

在一天结束时,我继续使用WideImage,它非常慢,但效果很好。这是我用来遮罩图像的类:<?phpnamespace AppBundle\Service\Import;use WideImage\WideImage;class ImageMasker{&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* @var string&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; private $tempDirectory;&nbsp; &nbsp; public function __construct(string $tempDirectory)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; $this->tempDirectory = $tempDirectory;&nbsp; &nbsp; }&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* @param string $sourcePath&nbsp; &nbsp; &nbsp;* @param string $maskPath&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public function mask($sourcePath, $maskPath)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; $source = WideImage::load($sourcePath);&nbsp; &nbsp; &nbsp; &nbsp; $mask&nbsp; &nbsp;= WideImage::load($maskPath);&nbsp; &nbsp; &nbsp; &nbsp; $tempFilename = uniqid().'.png';&nbsp; &nbsp; &nbsp; &nbsp; $tempPath&nbsp; &nbsp; &nbsp;= rtrim($this->tempDirectory, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$tempFilename;&nbsp; &nbsp; &nbsp; &nbsp; // applies the mask and saves the file&nbsp; &nbsp; &nbsp; &nbsp; $maskedImage = $source->applyMask($mask);&nbsp; &nbsp; &nbsp; &nbsp; $maskedImage->saveToFile($tempPath);&nbsp; &nbsp; &nbsp; &nbsp; return $tempPath;&nbsp; &nbsp; }}

人到中年有点甜

我想你想要这个:magick&nbsp;dress.png&nbsp;\(&nbsp;mask.png&nbsp;-alpha&nbsp;off&nbsp;-negate&nbsp;\)&nbsp;-compose&nbsp;copyalpha&nbsp;-composite&nbsp;result.png或者,如果您不喜欢括号,请加载蒙版并首先整理您的 Alpha 通道,然后加载礼服,然后在合成之前加载顺序:+swapmagick&nbsp;mask.png&nbsp;-alpha&nbsp;off&nbsp;-negate&nbsp;dress.png&nbsp;+swap&nbsp;&nbsp;-compose&nbsp;copyalpha&nbsp;-composite&nbsp;result.png

暮色呼如

它应该在ImageMagick 6或ImageMagick 7中使用copy_opacity而不是copy_alpha。这对我来说很好:输入:面具:convert&nbsp;dress.png&nbsp;\(&nbsp;mask.png&nbsp;-negate&nbsp;\)&nbsp;-alpha&nbsp;off&nbsp;-compose&nbsp;copy_opacity&nbsp;-composite&nbsp;result.png上述使用转换的命令适用于ImageMagick 6。如果使用 ImageMagick 7,请将转换更改为 magick。两者都对我有用。
打开App,查看更多内容
随时随地看视频慕课网APP