首先现打开一张图片。
<?php
header('content-type:image/jpeg;charset="utf-8"'); //告诉浏览器这是一张图片,不是html代码,不然会乱码
$imgSrc = './image1.jpg'; //图片存放路径
$img = imagecreatefromjpeg($imgSrc);//打开图片
imagejpeg($img); //解析图片
?>
增加文字水印。
<?php
header('content-type:image/jpeg;charset="utf-8"'); //告诉浏览器这是一张图片,不是html代码,不然会乱码
$imgSrc = './image1.jpg'; //图片存放路径
$img = imagecreatefromjpeg($imgSrc);//打开图片
$color = imagecolorallocate($img,0,0,0); //文字水印颜色分配,后三个参数为rgb,000为黑色
$text = '今天天气不错!'; //文本水印内容
imagettftext($img,40,0,200,200,$color,'STXINGKA.TTF',$text); //绘制图片水印
//参数解释,分别是:图片资源、字体大小、字体倾斜角度、文字在x轴位置、文字在y轴的位置、文本颜色、字体家族路径、文本内容
imagejpeg($img); //解析图片
?>
注意:
字体家族获取:
win10电脑--我的电脑--C盘--windows--Font--选择1种你喜欢的字体拷贝到项目中。
他是一种.ttf后缀的文件,你也可以到百度搜索一些你喜欢的字体下载解压即可使用。
如果你的水印是中文的话,那么你的字体家族也要找中文的字体,不能使用英文的字体家族,不然页面不会显示效果,但是英文文本可以使用中文的字体家族。
获取图片的宽高信息
<?php
$imgSrc = './image1.jpg'; //图片存放路径
$img = imagecreatefromjpeg($imgSrc);//打开图片
echo "图片的宽度是:";
var_dump(imagesx($img)); //获取图片的宽度
echo "图片的高度是:";
var_dump(imagesy($img)); //获取图片的高度
var_dump(getimagesize('./image1.jpg')); /*获取图片的详情信息,宽高、字节大小、
图片格式、命名、文件路径等,不过参数不能放变量的图片路径。*/
//print_r(getimagesize('./image1.jpg')); //print_r和var_dump输出同样效果
?>
我们看看图片是不是真的是1152X864
获取文本水印盒子的宽高
首先我们要知道文本水印的内容是实际上是有一个盒子包裹的,是有宽高的。
<?php
$imgSrc = './image1.jpg'; //图片存放路径
$img = imagecreatefromjpeg($imgSrc);//打开图片
$text = 'qianying.com'; //文本水印内容
imagettftext($img,40,0,100,100,$color,'STXINGKA.TTF',$text); //绘制图片水印
$posi = imagettfbbox(40,0,'STXINGKA.TTF',$text); //获取文本盒子的宽高信息
var_dump($posi);
imagedestroy($img); //释放资源
?>
每个数组下标对应的x和y轴坐标(这个非常重要)。
控制文本水印盒子放置位置
如果我们想把文本水印放在图片的右下角,我们第一个想法就是去直接手动调参数。
我们已知图片宽为1152px,高为864px。那么我们可以大概判断,水印文本的放置位置在x轴上的800px左右,高也是800左右,忽略字体大小40px一个字符不计。刚好可以到右下角这个位置。
但这种是写死的固定定位,我们换一下水印文本内容就会看出问题所在。
水印文字没有完整输出到图片上?这时候我们还是手动去调?那换一张图片、换字体大小、更改水印内容文本、水印文本盒子的宽高等都会受到影响,导致水印文本输出不完整,这种调X和Y轴的参数,显然不太合适了。
正确做法是:先获取图片的高和宽,再获取水印文本盒子的宽高,再来做出水印盒子相对于图片X轴和Y轴的位移判断。
完整代码:
<?php
header('content-type:image/jpeg;charset="utf-8"'); //告诉浏览器这是一张图片,不是html代码,不然会乱码
$imgSrc = './image1.jpg'; //图片存放路径
$img = imagecreatefromjpeg($imgSrc);//打开图片
$color = imagecolorallocate($img,0,0,0); //文字水印颜色分配,后三个参数为rgb,000为黑色
$text = '千影图库'; //文本水印内容
$posiBox_text = imagettfbbox(40,0,'STXINGKA.TTF',$text); //获取水印盒子的宽高信息
$textBox_width = $posiBox_text[2] - $posiBox_text[0];
//求出盒子的宽度,X轴:右下角的x坐标-左下角的x坐标 = 宽度
$img_width = imagesx($img); //获取图片的宽度
$img_height = imagesy($img); //获取图片的高度
imagettftext($img,40,0,$img_width-1-$textBox_width-($img_width/30),$img_height-1-($img_width/30),$color,'STXINGKA.TTF',$text); //绘制图片的文字水印
//参数解释,分别是:图片资源、字体大小、字体倾斜角度、文字在x轴位置、文字在y轴的位置、文本颜色、字体家族路径、文本内容
imagejpeg($img); //解析图片
?>
效果预览:
水印盒子的宽度是怎么求的?
图片水印处理
首先找一张带文字logo的图片,作为我们的图像水印拷贝。
比如我们用这张图片作为我们的图像水印拷贝。
实际效果预览:
代码:
<?php
header('content-type:image/jpeg;charset="utf-8"'); //告诉浏览器这是一张图片,不是html代码,不然会乱码
$imgSrc = './image1.jpg'; //图片存放路径
$waterImgSrc = './logo.png'; //水印图片存放路径
$img = imagecreatefromjpeg($imgSrc);//打开目标图片
$waterImg = imagecreatefrompng($waterImgSrc);//打开水印图片
$color = imagecolorallocate($img,0,0,0); //文字水印颜色分配,后三个参数为rgb,000为黑色
$text = '千影图库'; //文本水印内容
$posiBox_text = imagettfbbox(40,0,'STXINGKA.TTF',$text); //获取水印盒子的宽高信息
$textBox_width = $posiBox_text[2] - $posiBox_text[0]; //求出盒子的宽度,X轴:右下角的x坐标-左下角的x坐标 = 宽度
$img_width = imagesx($img); //获取目标图片的宽度
$img_height = imagesy($img); //获取目标图片的高度
$waterMarkWidth = imagesx($waterImg); //获取水印图片的宽度
$waterMarkHeight = imagesy($waterImg); //获取水印图片的高度
imagettftext($img,40,0,$img_width-1-$textBox_width-($img_width/30),$img_height-1-($img_width/30),$color,'STXINGKA.TTF',$text); //绘制图片的文字水印
//参数解释,分别是:图片资源、字体大小、字体倾斜角度、文字在x轴位置、文字在y轴的位置、文本颜色、字体家族路径、文本内容
imagecopy($img,$waterImg,100,100,0,0,$waterMarkWidth,$waterMarkHeight);
imagejpeg($img); //解析图片
imagedestroy($img); //释放资源
?>
imagecopy()方法:水印图片拷贝的参数说明: