3

我想在具有特定宽度、高度和顶部位置的 Imagick 对象中使区域透明。

例如,我需要一个从第 15 像素到顶部的 30 像素 x 30 像素的透明区域,但我找不到办法。

$canvas1 = new Imagick();

$canvas1->newImage(30,60,'black','png');

请帮忙。

4

4 回答 4

3

这可能是一种稍微简单的方法。我回收了@AndreKR 的设置代码以开始使用:

$im = new Imagick();
$im->newImage(100,100, 'red');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE); // make sure it has an alpha channel
$box=$im->getImageRegion(30,30,15,15);
$box->setImageAlphaChannel(Imagick::ALPHACHANNEL_TRANSPARENT);
$im->compositeImage($box,Imagick::COMPOSITE_REPLACE,15,15);
于 2015-08-23T12:22:56.347 回答
2

虽然您可以像这样用透明墨水(不是透明墨水)填充填充

$im->floodFillPaintImage('#FF000000', 10, '#FFFFFF', 0, 0, false);

这篇文章中,安东尼,显然是 ImageMagick 世界中的一些重要人物,他说你不能用透明进行绘图。

所以看起来你必须创建一个打孔图像,然后用它在你的实际图像中打出透明区域。为了在此处创建打孔,我在透明背景上绘制了不透明的矩形,然后反转整个图像:

$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);

冲床

这是打孔前的实际图像:

$im = new Imagick();
$im->newImage(100,100, 'red');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE); // make sure it has
                                                           // an alpha channel

图片

现在我们可以从我们的打孔图像中复制 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);

不成功的结果

但是,这两种方法都有效:

// 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);

结果

(浅蓝色为 Windows 照片查看器的背景,表示透明区域。)

于 2015-08-23T05:34:02.323 回答
0

尝试

$canvas1->setImageOpacity(0);
于 2012-09-10T10:18:02.090 回答
0

您可以按如下方式设置不透明度

$image->setImageOpacity(0.0);

如果将其设置为 0.0,则您创建的图像将变为透明

有关更多信息,您可以在 Imagick 中设置不透明度

如果您想要它用于特定区域部分,那么您需要通过使用 GD 库函数来更改方法,方法是执行一些类似这样的操作

 $img = imagecreatefrompng($imgPath); // load the image
 list($width,$height) = getimagesize($imgPath); // get its size
 $c = imagecolortransparent($img,imagecolorallocate($img,255,1,254)); // create      transparent color, (255,1,254) is a color that won't likely occur in your image
 $border = 10;
 imagefilledrectangle($img, $border, $border, $width-$border, $height-$border, $c); // draw transparent box
 imagepng($img,'after.png'); // save

我可以在此处的另一个论坛中看到类似的要求

于 2012-09-10T10:19:46.980 回答