美文网首页
php给图片处理添加水印(文本水印、图片水印)

php给图片处理添加水印(文本水印、图片水印)

作者: 似朝朝我心 | 来源:发表于2021-05-01 22:16 被阅读0次

首先现打开一张图片。

<?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()方法:水印图片拷贝的参数说明:



相关文章

网友评论

      本文标题:php给图片处理添加水印(文本水印、图片水印)

      本文链接:https://www.haomeiwen.com/subject/qtdrrltx.html