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

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

历经辛苦,找到一篇看起来可能会明白,简洁,简短的文章:(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

版权声明:本文为jmbt原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jmbt/p/16632996.html