ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

PHP实现图片加文字/图案水印

2022-08-28 16:31:08  阅读:373  来源: 互联网

标签:src dst 水印 图案 break PHP image 图片


需求:在一张背景图上添加二维码(带不同),并且个人名字,联系方式和个人头像。

思路:二维码和头像相当于往图片上添加图片,个人姓名和联系方式相当于玩图片上添加文字,这就是文字/图案水印了。思路就是上网百度!!

历经辛苦,找到一篇看起来可能会明白,简洁,简短的文章:(http://www.jb51.net/article/44829.htm)
//添加图片水印

 

$dst_path = 'dst.jpg';
$src_path = 'src.jpg';
//创建图片的实例
$dst = imagecreatefromstring(file_get_contents($dst_path));
$src = imagecreatefromstring(file_get_contents($src_path));
//获取水印图片的宽高
list($src_w, $src_h) = getimagesize($src_path);
//将水印图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果
imagecopymerge($dst, $src, 10, 10, 0, 0, $src_w, $src_h, 50);
//如果水印图片本身带透明色,则使用imagecopy方法
//imagecopy($dst, $src, 10, 10, 0, 0, $src_w, $src_h);
//输出图片
list($dst_w, $dst_h, $dst_type) = getimagesize($dst_path);
switch ($dst_type) {
    case 1://GIF
        header('Content-Type: image/gif');
        imagegif($dst);
        break;
    case 2://JPG
        header('Content-Type: image/jpeg');
        imagejpeg($dst);
        break;
    case 3://PNG
        header('Content-Type: image/png');
        imagepng($dst);
        break;
    default:
        break;
}
imagedestroy($dst);
imagedestroy($src);

 

因为之前很少接触图片方面的需求,通过观察代码哈哈哈,发现添加【图片水印】的思路是这样的:
1.确定背景图和水印图,利用这两个图片创建两个实例,实例相当于一种图片资源,在图片上添加文字或者图片,就是对实例进行操作,根据图片文件格式选择创建实例的方式,如果图片是jpg格式,则使用imagecreatefromjpeg();如图中所示,也可以先用file_get_contents获取到图片的内容,然后用imagecreatefromstring()来根据图片内容创建实例;

2.确定水印图片的左顶点的坐标(x,y),和设计师确认一下摆放水印图片的位置,水平和垂直距离是多少,像素单位,如图中程序里面的10,10;再得到水印图片的宽和长,如程序中的srcw和srcw和src_h;

3.确定好各项参数后,需要把水印图片和背景图合在一起
//将水印图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果
imagecopymerge(dst,dst,src, 10, 10, 0, 0, srcw,srcw,src_h, 50);
//如果水印图片本身带透明色,则使用imagecopy方法
//imagecopy(dst,dst,src, 10, 10, 0, 0, srcw,srcw,src_h);

当imagecopymerge最后的设置透明度的参数为100的时候,就相当于imagecopy,当透明度为0,则相当于没有显示出水印图片

4.把水印加在背景图上后,可以直接显示出图片,也可以把修改的图片实例保存到文件上
这段代码就是根据图片的格式,选择相应的方法,把图片显示出来

list($dst_w, $dst_h, $dst_type) = getimagesize($dst_path);
switch ($dst_type) {
    case 1://GIF
        header('Content-Type: image/gif');
        imagegif($dst);
        break;
    case 2://JPG
        header('Content-Type: image/jpeg');
        imagejpeg($dst);
        break;
    case 3://PNG
        header('Content-Type: image/png');
        imagepng($dst);
        break;
    default:
        break;
}

 

//保存到文件上
选择想要保存的格式,例如想把图片保存为jpg格式的文件,则imagejpeg(实例,保存路径);如imagejpeg($dst,’test.jpg’);

以上,添加图片水印完成。
弄完图片水印,就来研究一下【文字水印】。天真的我本来以为文字水印就是简单的文字,添加上去,没想到还是比较复杂的。。。

//添加文字水印

$dst_path = 'dst.jpg';
//创建图片的实例
$dst = imagecreatefromstring(file_get_contents($dst_path));
//打上文字
$font = './simsun.ttc';//字体
$black = imagecolorallocate($dst, 0x00, 0x00, 0x00);//字体颜色
imagefttext($dst, 13, 0, 20, 20, $black, $font, '快乐编程');
//输出图片
list($dst_w, $dst_h, $dst_type) = getimagesize($dst_path);
switch ($dst_type) {
    case 1://GIF
        header('Content-Type: image/gif');
        imagegif($dst);
        break;
    case 2://JPG
        header('Content-Type: image/jpeg');
        imagejpeg($dst);
        break;
    case 3://PNG
        header('Content-Type: image/png');
        imagepng($dst);
        break;
    default:
        break;
}
imagedestroy($dst);

 

以上的代码是上面附加的文章链接里面的完整代码,天真的我以为,直接复制,粘贴!OK!完成!结果!不行!
试过其他的办法,发现其他的办法会导致乱码,中文你懂的,所以还是要使用imagefttext(),这个方法可以使用配置的字体,乱码问题就不会出现了。
参考以下这篇文章,修改了一下代码,可以用了!偶像!
http://www.uncletoo.com/html/application/808.html
以下代码测试可用(不同环境不一定哦)

 

header("Content-type:image/jpeg");
//对比一下,以下代码和以上代码的差别主要是这一行
imagealphablending($image, true);
//设置颜色,后三个数字参数是RGB
$white = imagecolorallocate($image, 255,255, 255);
//字体文件路径,simsun宋体
$font = './assets/simsun.ttc';

//添加上姓名和联系方式,第二个参数设定font-size,第三个参数设定字体的阅读方向,0则为从左到右阅读,具体查一下PHP手册,第四和第五个参数则为文字水印的摆放坐标,第六是字体颜色,第七是字体样式,第八是文字内容
imagefttext($image, 17, 0, 388, 240, $white , $font, $name);
imagefttext($image, 17, 0, 388, 305, $white , $font, $phone);

 


对了,字体的文件从网上下载好,放到合适的路径使用哦。

以上添加图片和文字水印已经完成了,但是还有一个难点,需求里面包括了摆放个人的头像,而且头像需要裁剪成圆形头像。。。。没事!老铁!不要放弃!

搜了几个代码,有一个陷入死循环,有一个使用Imagick类,但是看到这位大哥的代码,不使用自带的类就写出来了,膜拜!上链接!
http://blog.csdn.net/sugang_ximi/article/details/30762421
通过观察大哥的代码,慢慢理解了他的思路,主要就是利用到了圆和正方形的关系,怎么说来着,我转换一下说法,大概是正方形的边长和圆的直径相等,那么该圆的圆心和正方形的中心为同一点。。。不知道怎么说啊,反正圆能被正方形嵌套。。。

而大哥的代码的逻辑又是什么呢?我的理解是,先用圆的直径为边长,画一个正方形,然后把头像嵌入到正方形里面,再把正方形减去圆形的四个角作处理,可透明也可适应背景色,毫无破绽!

所以当务之急是什么呢!!!就是找到圆的半径!通过与设计师沟通,得知用户的头像的圆形框是一个半径为50cm的圆!!

说实在的,好像我也没理解大哥的逻辑是什么样的,不过已经测试可用,我就直接用了,然后到了下班时间,我要去吃饭了。。。。
————————————————
版权声明:本文为CSDN博主「吃完苹果好睡觉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012866684/article/details/68068265

标签:src,dst,水印,图案,break,PHP,image,图片
来源: https://www.cnblogs.com/jmbt/p/16632996.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有