PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现

之前记录过一篇文章,不过那只是简单将二维码合成到海报中去,这次还要合成头像,而且是圆形。所需要素材就不一一列举,直接代码吧

1、先获取用户头像

有的用户是自定义头像(自定义头像是其他站点),有的用户是小程序头像

 1 if (!$user['logo_status'] && $user['logo']) {2     $app_domain = config('app_url');//因为自己上传的头像都放在了小程序的后台上3     $user['avatarurl'] = $app_domain.$user['logo'];4     //$headurl = getcwd().'/upload/logo/30f792c66405eb51304086cec6025b48.png';5 }6 $img_file = curl_file_get_contents($user['avatarurl']);  //小程序传的头像是网络地址需要周转一下7 //$img_content_logo= base64_encode($img_file);8 $file_tou_name = time().".png";9 $headurl = getcwd().'/upload/logo/'.$file_tou_name;
10 file_put_contents($headurl,$img_file);

2、将二维码缩小到206*206,微信二维码默认尺寸是430*430

1 //1、首先将二维码缩小成206*206
2 $thumb = imagecreatetruecolor(206,206);     //创建一个新的画布(缩放后的),从左上角开始填充透明背景
3 $img_content = $this->get_resource_by_img(getcwd().$qrcode);//虽然保存二维码文件的时候,以后缀.png命名,但是格式确实jpg格式的图片
4 imagecopyresampled($thumb, $img_content, 0, 0, 0, 0, 206, 206, 430, 430);
5 imagedestroy($img_content);

3、将二维码合成到海报中,前提海报尺寸为750*909,

1 //$arr = getimagesize(getcwd().$promote['value']);
2 //if($arr[2] != 2) com_out_fail('海报资源格式不正确,请联系后台管理员更换');
3 //$imgs = imagecreatefromjpeg(getcwd().$promote['value']);
4 $imgs = $this->get_resource_by_img(getcwd().$promote['value']);//暂时海报资源是png格式的
5 imagecopy($imgs, $thumb, 272, 529, 0, 0, 206, 206);

4、将头像转换成圆形,再裁剪为132*132,其实小程序头像默认尺寸就是132*132的,这里主要是兼容自定义头像

 1 //将用户头像先转换成圆形,再合成到海报中2 list($imgg,$w) = $this->yuan_img($headurl);//yuan_img() 方法在文末会列出3 //$file_name = "2_".time().".png";4 //imagepng($imgg,getcwd().'/upload/logo/'.$file_name);5 //裁剪为132*132的6 $imgg = $this->get_new_size($imgg,132,132,$w);//小程序头像其实不用裁剪,小程序头像本身就是132*132的,不过文档好像没更新7 //$file_name = "4_".time().".png";8 //imagepng($imgg,getcwd().'/upload/logo/'.$file_name);9 //imagedestroy($imgg);
10 //$logo = imagecreatefrompng(getcwd().'/upload/logo/'.$file_name);
11 imagecopy($imgs, $imgg, 309, 20, 0, 0, 132, 132);

5、最后保存生成的海报,避免重复生成,只需要在合适的机会重新生成就行

 1 //最后、保存到服务器2 $promote_img = '/upload/promote_img/'.$this->id."_promote_img.png";3 imagepng($imgs,getcwd().$promote_img); //保存4 imagedestroy($imgs);5 imagedestroy($thumb);6 imagedestroy($imgg);7 //删除多余图片文件8 unlink($headurl);9 //4、入库
10 User::where('id',$this->id)->update([
11     'promote_img'=>$promote_img,
12     'promote_img_status'=>1,
13 ]);

用到的方法如下

 1 /*2  * 通过curl获取数据,而不是发送请求,比file_get_contents效率高3  */4 function curl_file_get_contents($durl)5 {6     $ch = curl_init();7     curl_setopt($ch, CURLOPT_URL, $durl);8     curl_setopt($ch, CURLOPT_TIMEOUT, 5);9     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
10     $r = curl_exec($ch);
11     curl_close($ch);
12     return $r;
13 }

 1     /*2      * 转换为圆形3      */4     private function yuan_img($imgpath)5     {6         $wh  = getimagesize($imgpath);//pathinfo()不准7         $src_img = null;8         switch ($wh[2]) {9             case 1:
10                 //gif
11                 $src_img = imagecreatefromgif($imgpath);
12                 break;
13             case 2:
14                 //jpg
15                 $src_img = imagecreatefromjpeg($imgpath);
16                 break;
17             case 3:
18                 //png
19                 $src_img = imagecreatefrompng($imgpath);
20                 break;
21         }
22         $w   = $wh[0];
23         $h   = $wh[1];
24         $w   = min($w, $h);
25         $h   = $w;
26         $img = imagecreatetruecolor($w, $h);
27         //这一句一定要有
28         imagesavealpha($img, true);
29         //拾取一个完全透明的颜色,最后一个参数127为全透明
30         $bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
31         imagefill($img, 0, 0, $bg);
32         $r   = $w / 2; //圆半径
33         $y_x = $r; //圆心X坐标
34         $y_y = $r; //圆心Y坐标
35         for ($x = 0; $x < $w; $x++) {
36             for ($y = 0; $y < $h; $y++) {
37                 $rgbColor = imagecolorat($src_img, $x, $y);
38                 if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
39                     imagesetpixel($img, $x, $y, $rgbColor);
40                 }
41             }
42         }
43         return [$img,$w];
44     }
45
46     /*
47      * 根据指定尺寸裁剪目标图片,这里统一转成132*132的
48      * 注意第一个参数,为了简便,直接传递的是图片资源,如果是绝对地址图片路径,可以加以改造
49      */
50     private function get_new_size($imgpath,$new_width,$new_height,$w)
51     {
52         $image_p = imagecreatetruecolor($new_width, $new_height);//新画布
53         $bg = imagecolorallocatealpha($image_p, 255, 255, 255, 127);
54         imagefill($image_p, 0, 0, $bg);
55         imagecopyresampled($image_p, $imgpath, 0, 0, 0, 0, $new_width, $new_height, $w, $w);
56         return $image_p;
57     }
58
59     /*
60      * 根据绝对路径的图片地址获取对应的图片资源,
61      */
62     private function get_resource_by_img($img)
63     {
64         $wh  = getimagesize($img);//比pathinfo要准
65         $src_img = null;
66         switch ($wh[2]) {
67             case 1:
68                 //gif
69                 $src_img = imagecreatefromgif($img);
70                 break;
71             case 2:
72                 //jpg
73                 $src_img = imagecreatefromjpeg($img);
74                 break;
75             case 3:
76                 //png
77                 $src_img = imagecreatefrompng($img);
78                 break;
79         }
80         return $src_img;
81     }

最后来一张,合成的效果图:

PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现相关推荐

  1. 【图像加密】正交拉丁方+二维Arnold置乱图像加密【含GUI Matlab源码 813期】

    ⛄一.正交拉丁方置乱及二维Arnold置乱简介 0 引言 随着通讯技术的飞速发展, 越来越多的领域需要传送数字图像信号, 因此信息的传送安全问题显得越来越重要.通常应用于数字图像通信的两种保护技术为: ...

  2. 【Python机器学习】PCA降维算法讲解及二维、高维数据可视化降维实战(附源码 超详细)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 维数灾难 维数灾难是指在涉及到向量计算的问题中,当维数增加时,空间的体积增长得很快,使得可用的数据在空间中的分布变得稀疏,向量的计算量呈指数倍增长的一 ...

  3. jquery.qrcode生成带logo的二维码,同时生成带二维码的好友分享图片(js与canvas实现二维码和图片合成的海报)

    首先给大家看一下效果图(纯jQuery前端技术): 提供一下demo 源代码和jquery.qrcode文件下载: https://download.csdn.net/download/qq15577 ...

  4. thinkphp生成带二维码的海报

    阿里云搞活动,想要抓紧买 用thinkphp生成带二维码的海报功能. 准备:公众号二维码图片一张 背景图片一张 将二维码和背景图片合成的方法,可添加到common/common/function.ph ...

  5. PHP生成带二维码的分享图片

    综述 项目开发中需求,要求在APP中进行分享的时候可以分享图片,图片由美工进行设计,其上带有二维码,分享给别人可以直接长按图片进行识别.这种方式在分享中用户体验更好,首先图片由美工设计很好看,其次这种 ...

  6. Python基于pyzbar、opencv、pyqt5库,实现二维码识别 gui 应用程序开发

    二维码组成结构基本介绍 二维码识别背景介绍 视觉的方法可以用来估计位置和姿态.最容易想到的是在目标上布置多个容易识别的特征,这样使用opencv相机标定和.相机畸变矫正.轮廓提取.solvepnp来获 ...

  7. 前端Vue H5生成带二维码的分享海报,实现长按保存到手机相册

    前端Vue H5生成带二维码的分享海报,实现长按保存到手机相册 前言:关于H5分享海报的需求,经常会遇到,通常就是一个分享的二维码+分享文案,生成一张图片,供用户在手机上长按保存到手机,然后就可以将保 ...

  8. matlab-线性代数 矩阵的合成(二维、三维)

    2019独角兽企业重金招聘Python工程师标准>>>      matlab : R2018a 64bit       OS : Windows 10 x64 typesettin ...

  9. 价值1500的全新UI众人帮任务帮PHP源码/悬赏任务抖音快手头条点赞源码/带三级分销可封装小程序

    xia 全新UI众人帮任务帮.悬赏任务抖音快手头条点赞PHP源码,带三级分销:某站售价1500元,后台Thinkphp,前端可封装打包,网页端加安卓苹果,可封装小程序. 功能介绍 1.支持用户发布任务 ...

最新文章

  1. 区块链热度不断,那么究竟是泡沫还是未来?
  2. 银联高校极客挑战赛 初赛 第一场、第二场合集(3+3题)
  3. 不要为了“分库分表”而“分库分表”
  4. [arduino]-序言:面向仅有C语言基础之人的单片机开发板
  5. C++对数计算log
  6. ML语言/函数式编程原理(一)
  7. 参数检验和非参数检验的区别
  8. STATA进行回归分析时,自变量是分类变量,如何设置哑变量?
  9. 数据结构之leetcode 347题
  10. Silverlight加载xap后通过反射相互调用方法及元素
  11. 干货精选 | 迅雷链再度亮相“魔都”上海,性能与安全兼得的区块链为何备受关注?...
  12. 计算机网络之DNS面试题
  13. linux sed去除重复,删除文本中的重复行(sort+uniq/awk/sed)
  14. Eclipes更改主题及字体
  15. 什么是金手指,金手指的设计要求有哪些?
  16. WORD 使用公式对齐和标注的小技巧
  17. Cstyle的UEFI导读: UEFI的N种实现及差别
  18. [NPUCTF2020]ezlogin xPATH注入
  19. CVE-2020-14364:QEMU USB模块越界读写漏洞通告
  20. .NET程序中加入Autodesk Design Review 2013 ,打包完成后安装提示未注册XXX.dll解决办法

热门文章

  1. vuejs可爱动物卡片样式动画js特效
  2. 深度学习中查看显卡使用情况
  3. springboot+vue精准扶贫志愿者招募管理系统
  4. 聊天机器人demo库——gradio
  5. 阿了嗝欢的小白日记——No session异常的发生原因和解决方案
  6. 什么是不设限的未来?
  7. 腾讯T3亲自教你!Android推送技术解析,写给正在求职的安卓开发
  8. python 腾讯企业邮箱 535, b'Error: authentication failed, system busy'
  9. markdown表格快捷键
  10. 物理专业出身的Flash业余爱好者喜获Adobe Flash开发大赛一等奖