我想在具有特定宽度,高度和顶部位置的Imagick对象中创建一个透明区域。
例如,我需要一个从第15个px到顶部的30px x 30px的透明区域,但我找不到办法。
$canvas1 = new Imagick();
$canvas1->newImage(30,60,'black','png');
请帮忙。
答案 0 :(得分:2)
虽然您可以使用透明度墨水(不是透明墨水)泛滥填充,但是这样:
$im->floodFillPaintImage('#FF000000', 10, '#FFFFFF', 0, 0, false);
在this post中,安东尼显然是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照片查看器的背景,表示透明区域。)
答案 1 :(得分:2)
这可能是一种稍微简单的方法。我回收了@ 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 :(得分:0)
尝试
$canvas1->setImageOpacity(0);
答案 3 :(得分:0)
您可以按如下方式设置不透明度
$image->setImageOpacity(0.0);
如果将其设置为0.0,则您已创建的图像将变为透明
了解更多信息如果你想要它用于特定区域部分,那么你需要通过使用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
我可以看到另一个forum here
中发布的类似要求