为了账号安全,请及时绑定邮箱和手机立即绑定

使用黑白蒙版遮罩 PNG 图像

使用黑白蒙版遮罩 PNG 图像

PHP
白衣染霜花 2022-08-19 15:53:43
我有下面的图像(请注意透明背景):我还有一个相同大小的黑白面具:我想“裁剪”这件衣服,只得到黑色圆圈中包含的第一幅图像的一部分。我尝试了许多不同的方法,但它们不起作用或太慢:1) ImageMagick (commandline) <== 我可以使用哪个命令来实现此目的?我尝试乘法和复制不透明度,但它们不起作用2)WideImage正在工作:但它需要超过12秒。$maskedImage = $source->applyMask($mask);如果可能的话,我对ImageMagick解决方案感兴趣。
查看完整描述

4 回答

?
www说

TA贡献1775条经验 获得超8个赞

您的 ImageMagick 版本似乎太旧,无法包含“copyalpha”撰写运算符。这是获得结果的另一种方法...

convert dress.png \( circle.png -negate \) \
   \( -clone 0 -transparent red +transparent red \) -insert 0 -composite result.png

它会在主图像中读取,然后在蒙版图像中读取并否定它,然后创建一个透明层,并使用“-insert”将其移动到列表中的第一个位置。ImageMagick 对包含三个输入图像的“-composite”的默认处理是使用第三个图像(现在是带有黑色圆圈的图像)作为 Alpha 蒙版。你仍然需要“否定”那个面具,或者制作一个黑白倒置的新面具。

用于创建透明画布的方法是在括号内读取其他图像之一,将红色所有内容更改为透明,然后将红色的所有内容更改为透明。这将导致一个完全透明的画布用作复合列表中的第一个图像,即目标图像。


查看完整回答
反对 回复 2022-08-19
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

在一天结束时,我继续使用WideImage,它非常慢,但效果很好。这是我用来遮罩图像的类:


<?php


namespace AppBundle\Service\Import;


use WideImage\WideImage;


class ImageMasker

{

    /**

     * @var string

     */

    private $tempDirectory;


    public function __construct(string $tempDirectory)

    {

        $this->tempDirectory = $tempDirectory;

    }


    /**

     * @param string $sourcePath

     * @param string $maskPath

     */

    public function mask($sourcePath, $maskPath)

    {

        $source = WideImage::load($sourcePath);

        $mask   = WideImage::load($maskPath);


        $tempFilename = uniqid().'.png';

        $tempPath     = rtrim($this->tempDirectory, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$tempFilename;


        // applies the mask and saves the file

        $maskedImage = $source->applyMask($mask);

        $maskedImage->saveToFile($tempPath);


        return $tempPath;

    }

}


查看完整回答
反对 回复 2022-08-19
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

我想你想要这个:

magick dress.png \( mask.png -alpha off -negate \) -compose copyalpha -composite result.png


//img1.sycdn.imooc.com//62ff41d200017c1504560335.jpg

或者,如果您不喜欢括号,请加载蒙版并首先整理您的 Alpha 通道,然后加载礼服,然后在合成之前加载顺序:+swap

magick mask.png -alpha off -negate dress.png +swap  -compose copyalpha -composite result.png



查看完整回答
反对 回复 2022-08-19
?
暮色呼如

TA贡献1853条经验 获得超9个赞

它应该在ImageMagick 6或ImageMagick 7中使用copy_opacity而不是copy_alpha。这对我来说很好:

输入:

//img1.sycdn.imooc.com//62ff41df0001eb3504870618.jpg

面具:

//img1.sycdn.imooc.com//62ff41e70001e9d204790429.jpg

convert dress.png \( mask.png -negate \) -alpha off -compose copy_opacity -composite result.png

//img1.sycdn.imooc.com//62ff41f10001ae4203760279.jpg

上述使用转换的命令适用于ImageMagick 6。如果使用 ImageMagick 7,请将转换更改为 magick。两者都对我有用。



查看完整回答
反对 回复 2022-08-19
  • 4 回答
  • 0 关注
  • 211 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信