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

首先现打开一张图片。

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



©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容