Imagick扩展
imagick 扩展可以供PHP调用ImageMagick功能,而ImageMagick是图片处理神器。
图片处理中,经常会需要对一个图片打水印,这里记录下打文字水印。水印的话,通常不希望喧宾夺主,不可以太影响到原图的效果(完全不影响这个也不可能啦)。水印文字白色,且有一个透明度,这样应该会是蛮好一点儿的效果,可问题来了,如果图片某部分本是白色,白色的字在白色的图片上面,就会看不到了。so, 就需要给字加一个描边或者阴影的效果,确保水印文字会看得到。
1. 文字水印加描边
描边文字水印的效果比阴影稍稍逊色,不过特省事。
代码实现:
<?php
$waterText = '柳絮池塘淡淡风';
$imgUrl = './xxxx.jpeg';
$textColor = 'white';
$strokeColor = 'black';
$textOpa = 0.5;
$strokeOpa = 0.3;
$letterSpace = 2;
$fontSize = 40;
$image = new Imagick($imgUrl);
$draw = new ImagickDraw();
$draw->setFont('./Microsoft Yahei.ttf');
$draw->setFillColor($textColor);
$draw->setFillOpacity($textOpa);
$draw->setStrokeColor($strokeColor);
$draw->setStrokeWidth(1);
$draw->setStrokeOpacity($strokeOpa);
$draw->setTextKerning($letterSpace); //文字间距
$draw->setTextEncoding('UTF-8');
$draw->setGravity(Imagick::GRAVITY_CENTER);
$draw->setFontSize($fontSize);
//$draw->setFontWeight(100); //这个weight 的设置没有效果...
$draw->annotation(0, 0, $waterText);
$image->drawImage($draw);
/* Output the image with headers */
header("Content-Type: image/" . $image->getImageFormat());
echo $image->getImagesBlob();
2. 文字水印加阴影
水印加阴影的效果看起来就比较立体了。
代码实现:
<?php
$waterText = '柳絮池塘淡淡风';
$imgUrl = './xxx.jpeg';
$textColor = 'white';
$shadowColor = 'black';
$textOpa = 0.35;
$letterSpace = 1;
$fontSize = 36;
$image = new Imagick($imgUrl);
$imgProperty = $image->getImageGeometry();
$imgWidth = $imgProperty['width'];
$imgHeight = $imgProperty['height'];
$draw = new ImagickDraw();
$draw->setFont('./Microsoft Yahei.ttf');
$draw->setFillColor($textColor);
$draw->setFillOpacity($textOpa);
$draw->setTextKerning($letterSpace);
$draw->setTextEncoding('UTF-8');
$draw->setGravity(Imagick::GRAVITY_CENTER);
$draw->setFontSize($fontSize);
//$draw->setFontWeight(100);
$draw->annotation(0, 0, $waterText);
$text = new Imagick();
$metrix = $text->queryFontMetrics($draw, $waterText);
$text->newImage($metrix['textWidth'], $metrix['textHeight'], 'none');
$text->setImageFormat('png');
$text->drawImage($draw);
$shadow = clone $text;
$shadow->setImageBackgroundColor(new ImagickPixel($shadowColor));
$shadow->shadowImage(50, 0.5, 0, 0);
$shadow->compositeImage($text, Imagick::COMPOSITE_OVER, 0, 0);
$image->compositeImage($shadow, $shadow->getImageCompose(), ($imgWidth - $metrix['textWidth']) / 2, ($imgHeight - $metrix['textHeight']) / 2);
//$image->writeImage();
header("Content-Type: image/{$image->getImageFormat()}");
echo $image->getImagesBlob();