PHP Imagick,如何使某个区域透明?

3
我想在一个Imagick对象中制作一个透明区域,该区域具有特定的宽度、高度和顶部位置。
例如,我需要一个30px x 30px的透明区域,从第15个像素到顶部,但我找不到实现的方法。
$canvas1 = new Imagick();

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

Please help.

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

2
您可以使用透明墨水(而不是普通的透明墨水)进行泛洪填充,如下所示:
$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

这是冲孔前的实际图像:
$im = new Imagick();
$im->newImage(100,100, 'red');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE); // make sure it has
                                                           // an alpha channel

image

现在我们可以从打洞图片中复制 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

然而,这两个都可以工作:
// 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

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

0

尝试一下

$canvas1->setImageOpacity(0);

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

我在另一个论坛链接中看到了一个类似的需求。


1
但我不想对所有imagick对象进行透明处理,只想针对某个区域进行处理。 - Onur Kucukkece
例如,我在问题中提供的imagick对象具有30像素的宽度和60像素的高度,我想在底部创建一个30像素宽和30像素高的透明区域。@UmairIqbal - Onur Kucukkece
我认为您正在使用Imagick创建图像,请尝试使用核心GD函数,这样您会获得更多的灵活性。 - Aravind.HU

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接