4 回答
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 蒙版。你仍然需要“否定”那个面具,或者制作一个黑白倒置的新面具。
用于创建透明画布的方法是在括号内读取其他图像之一,将红色所有内容更改为透明,然后将不红色的所有内容更改为透明。这将导致一个完全透明的画布用作复合列表中的第一个图像,即目标图像。
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;
}
}
TA贡献1895条经验 获得超7个赞
我想你想要这个:
magick dress.png \( mask.png -alpha off -negate \) -compose copyalpha -composite result.png
或者,如果您不喜欢括号,请加载蒙版并首先整理您的 Alpha 通道,然后加载礼服,然后在合成之前加载顺序:+swap
magick mask.png -alpha off -negate dress.png +swap -compose copyalpha -composite result.png
TA贡献1853条经验 获得超9个赞
它应该在ImageMagick 6或ImageMagick 7中使用copy_opacity而不是copy_alpha。这对我来说很好:
输入:
面具:
convert dress.png \( mask.png -negate \) -alpha off -compose copy_opacity -composite result.png
上述使用转换的命令适用于ImageMagick 6。如果使用 ImageMagick 7,请将转换更改为 magick。两者都对我有用。
- 4 回答
- 0 关注
- 211 浏览
添加回答
举报