您可以使用透明墨水(而不是普通的透明墨水)进行泛洪填充,如下所示:
$im->floodFillPaintImage('#FF000000', 10, '#FFFFFF', 0, 0, false);
在
这篇帖子中,显然是 ImageMagick 宇宙中的重要人物 Anthony 表示,你不能使用透明度进行绘制。
因此,似乎你需要创建一个 Punch 图像,然后将其用于在实际图像中打洞。为了创建 Punch,我在透明背景上绘制不透明矩形,然后反转整个图像:
$punch = new Imagick();
$punch->newImage(100,100, 'transparent');
$drawing = new ImagickDraw();
$drawing->setFillColor(new ImagickPixel('black'));
$drawing->rectangle(15, 15, 45, 45);
$punch->drawImage($drawing);
$punch->negateImage(true, Imagick::CHANNEL_ALPHA);
![punch](https://istack.dev59.com/2koQ5.webp)
这是冲孔前的实际图像:
$im = new Imagick();
$im->newImage(100,100, 'red');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);
![image](https://istack.dev59.com/vofeU.webp)
现在我们可以从打洞图片中复制 alpha 通道。出于我不知道的原因,显而易见的方法无法实现:
// Copy over the alpha channel from one image to the other
// this does NOT work, the $channel parameter seems to be useless:
// $im->compositeImage($punch, Imagick::COMPOSITE_SRC, 0, 0, Imagick::CHANNEL_ALPHA);
![unsuccessful result](https://istack.dev59.com/XHWsu.webp)
然而,这两个都可以工作:
// Copy over the alpha channel from one image to the other
// $im->compositeImage($punch, Imagick::COMPOSITE_COPYOPACITY, 0, 0);
// $im->compositeImage($punch, Imagick::COMPOSITE_DSTIN, 0, 0);
![result](https://istack.dev59.com/dNaCk.webp)
(浅蓝色是Windows照片查看器的背景,表示透明区域。)