Bootstrap

Imagick 为图片添加文字水印


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