你能用PHP ImageMagick获得透明渐变吗?

时间:2011-01-18 17:41:20

标签: php imagemagick

有些事情:

$gradient->newPseudoImage($width, $height, "gradient:transparent-transparent");

基本上我想为上传的图像创建一个湿地板效果。到目前为止,您似乎只能将渐变创建为纯色。

2 个答案:

答案 0 :(得分:8)

事实证明,如果您克隆的图像没有设置Alpha通道,则无法创建从图像到透明背景的渐变(至少,我无法找到方法)您可以做的是测试alpha通道并在需要时设置它。如果你有兴趣,这是工作代码:

$im = new Imagick('image.jpg');

if (!$im->getImageAlphaChannel()) {
    $im->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET);
}

$refl = $im->clone();
$refl->flipImage();

$gradient = new Imagick();

$gradient->newPseudoImage($refl->getImageWidth() + 10, $refl->getImageHeight() + 10, "gradient:transparent-black");

$refl->compositeImage($gradient, imagick::COMPOSITE_DSTOUT, 0, 0);

$canvas = new Imagick();

$width = $im->getImageWidth() + 40;
$height = ($im->getImageHeight() * 2) + 30;

$canvas->newImage($width, $height, 'none');
$canvas->setImageFormat('png');

$canvas->compositeImage($im, imagick::COMPOSITE_SRCOVER, 20, 10);
$canvas->compositeImage($refl, imagick::COMPOSITE_SRCOVER, 20, $im->getImageHeight() + 10);

这将需要磨机jpg并将其转换为png,反射渐变为透明背景。

$canvas->writeImages("new.png", true);

答案 1 :(得分:1)

透明渐变的颜色代码为“none”。

例如,此程序在100x100像素的PNG图像中保存从透明(顶部)到红色(底部)的渐变:

$gradient = new Imagick();
$width = 100;
$height = 100;
$gradient->newPseudoImage($width, $height, 'gradient:none-red');
$gradient->setImageFormat('png');
$gradient->writeImage('test.png');

有关渲染渐变的更多详细信息,请参阅ImageMagick Canvas documentation