PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现
PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现
之前记录过一篇文章,不过那只是简单将二维码合成到海报中去,这次还要合成头像,而且是圆形。所需要素材就不一一列举,直接代码吧
1、先获取用户头像
有的用户是自定义头像(自定义头像是其他站点),有的用户是小程序头像
if (!$user['logo_status'] && $user['logo']) {
$app_domain = config('app_url');//因为自己上传的头像都放在了小程序的后台上
$user['avatarurl'] = $app_domain.$user['logo'];
//$headurl = getcwd().'/upload/logo/30f792c66405eb51304086cec6025b48.png';
}
$img_file = curl_file_get_contents($user['avatarurl']); //小程序传的头像是网络地址需要周转一下
//$img_content_logo= base64_encode($img_file);
$file_tou_name = time().".png";
$headurl = getcwd().'/upload/logo/'.$file_tou_name;
file_put_contents($headurl,$img_file);
2、将二维码缩小到206*206,微信二维码默认尺寸是430*430
//1、首先将二维码缩小成206*206
$thumb = imagecreatetruecolor(206,206); //创建一个新的画布(缩放后的),从左上角开始填充透明背景
$img_content = $this->get_resource_by_img(getcwd().$qrcode);//虽然保存二维码文件的时候,以后缀.png命名,但是格式确实jpg格式的图片
imagecopyresampled($thumb, $img_content, 0, 0, 0, 0, 206, 206, 430, 430);
imagedestroy($img_content);
3、将二维码合成到海报中,前提海报尺寸为750*909,
//$arr = getimagesize(getcwd().$promote['value']);
//if($arr[2] != 2) com_out_fail('海报资源格式不正确,请联系后台管理员更换');
//$imgs = imagecreatefromjpeg(getcwd().$promote['value']);
$imgs = $this->get_resource_by_img(getcwd().$promote['value']);//暂时海报资源是png格式的
imagecopy($imgs, $thumb, 272, 529, 0, 0, 206, 206);
4、将头像转换成圆形,再裁剪为132*132,其实小程序头像默认尺寸就是132*132的,这里主要是兼容自定义头像
//将用户头像先转换成圆形,再合成到海报中
list($imgg,$w) = $this->yuan_img($headurl);//yuan_img() 方法在文末会列出
//$file_name = "2_".time().".png";
//imagepng($imgg,getcwd().'/upload/logo/'.$file_name);
//裁剪为132*132的
$imgg = $this->get_new_size($imgg,132,132,$w);//小程序头像其实不用裁剪,小程序头像本身就是132*132的,不过文档好像没更新
//$file_name = "4_".time().".png";
//imagepng($imgg,getcwd().'/upload/logo/'.$file_name);
//imagedestroy($imgg);
//$logo = imagecreatefrompng(getcwd().'/upload/logo/'.$file_name);
imagecopy($imgs, $imgg, 309, 20, 0, 0, 132, 132);
5、最后保存生成的海报,避免重复生成,只需要在合适的机会重新生成就行
//最后、保存到服务器
$promote_img = '/upload/promote_img/'.$this->id."_promote_img.png";
imagepng($imgs,getcwd().$promote_img); //保存
imagedestroy($imgs);
imagedestroy($thumb);
imagedestroy($imgg);
//删除多余图片文件
unlink($headurl);
//4、入库
User::where('id',$this->id)->update([
'promote_img'=>$promote_img,
'promote_img_status'=>1,
]);
用到的方法如下
/*
* 通过curl获取数据,而不是发送请求,比file_get_contents效率高
*/
function curl_file_get_contents($durl)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $durl);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$r = curl_exec($ch);
curl_close($ch);
return $r;
}
/*
* 转换为圆形
*/
private function yuan_img($imgpath)
{
$wh = getimagesize($imgpath);//pathinfo()不准
$src_img = null;
switch ($wh[2]) {
case 1:
//gif
$src_img = imagecreatefromgif($imgpath);
break;
case 2:
//jpg
$src_img = imagecreatefromjpeg($imgpath);
break;
case 3:
//png
$src_img = imagecreatefrompng($imgpath);
break;
}
$w = $wh[0];
$h = $wh[1];
$w = min($w, $h);
$h = $w;
$img = imagecreatetruecolor($w, $h);
//这一句一定要有
imagesavealpha($img, true);
//拾取一个完全透明的颜色,最后一个参数127为全透明
$bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
imagefill($img, 0, 0, $bg);
$r = $w / 2; //圆半径
$y_x = $r; //圆心X坐标
$y_y = $r; //圆心Y坐标
for ($x = 0; $x < $w; $x++) {
for ($y = 0; $y < $h; $y++) {
$rgbColor = imagecolorat($src_img, $x, $y);
if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
}
}
return [$img,$w];
} /*
* 根据指定尺寸裁剪目标图片,这里统一转成132*132的
* 注意第一个参数,为了简便,直接传递的是图片资源,如果是绝对地址图片路径,可以加以改造
*/
private function get_new_size($imgpath,$new_width,$new_height,$w)
{
$image_p = imagecreatetruecolor($new_width, $new_height);//新画布
$bg = imagecolorallocatealpha($image_p, 255, 255, 255, 127);
imagefill($image_p, 0, 0, $bg);
imagecopyresampled($image_p, $imgpath, 0, 0, 0, 0, $new_width, $new_height, $w, $w);
return $image_p;
} /*
* 根据绝对路径的图片地址获取对应的图片资源,
*/
private function get_resource_by_img($img)
{
$wh = getimagesize($img);//比pathinfo要准
$src_img = null;
switch ($wh[2]) {
case 1:
//gif
$src_img = imagecreatefromgif($img);
break;
case 2:
//jpg
$src_img = imagecreatefromjpeg($img);
break;
case 3:
//png
$src_img = imagecreatefrompng($img);
break;
}
return $src_img;
}
最后来一张,合成的效果图:
PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现的更多相关文章
- PHP 使用GD库合成带二维码的海报步骤以及源码实现
PHP 使用GD库合成带二维码的海报步骤以及源码实现 在做微信项目开发过程中,经常会遇到图片合成的问题,比如将用户的二维码合成到宣传海报中,那么,遇到这种情况,利用PHP的GD库也是很容易实现的,实现 ...
- iOS开发——iOS7(及以后版本) SDK自带二维码(含条形码)扫码、二维码生成
本文转载至 http://www.cnblogs.com/leotangcn/p/4357907.html 现在很多APP都涉及了二维码扫码功能,这个功能简单实用,很多情况下用户乐于使用,现在本文带来 ...
- 二维码合成,将苹果和安卓(ios和android)合成一个二维码,让用户扫描一个二维码就可以分别下载苹果和安卓的应用
因为公司推广的原因,没有合适的将苹果和安卓(ios和android)合成一个二维码的工具. 因为这个不难,主要是根据浏览器的UA进行判断,所以就自己开发了一个网站 网站名称叫:好推二维码 https ...
- C# 实现生成带二维码的专属微信公众号推广海报
原文:C# 实现生成带二维码的专属微信公众号推广海报 很多微信公众号中需要生成推广海报的功能,粉丝获得专属海报后可以分享到朋友圈或发给朋友,为公众号代言邀请好友即可获取奖励的.海报自带渠道二维码,粉丝 ...
- OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点(图文并茂+浅显易懂+程序源码)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码
在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能 ...
- OpenCV开发笔记(六十五):红胖子8分钟带你深入了解ORB特征点(图文并茂+浅显易懂+程序源码)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- 利用phpqrcode二维码生成类库合成带logo的二维码并且用合成的二维码生成海报(二)
前期准备 引入phpqrcode类库(下载地址:https://download.csdn.net/download/weixin_37557729/11891240:支持彩色二维码的下载地址:htt ...
- python库myqr生成二维码
python中有一个好玩的库,不仅可以生成各种花色的二维码,还可以生成动态二维码. MyQR是一个能够生成自定义二维码的第三方库,可以根据需要生成普通二维码.带图片的艺术二维码,也可以生成动态二维码 ...
随机推荐
- js获取省市
前台代码 @{ IList<Provinces> allProvinces = ViewBag.AllProvinces; IList<Districts> allDistri ...
- c#ArrayList 对象集合 按某字段(属性)排序
主程序代码 newsCompare newsCompare = new ItemManage.newsCompare(); newsList.Sort(newsCompare); 自定义类代码(按照C ...
- maven课程 项目管理利器-maven 3-6 maven中Pom.xml的解析 3星
本节主要讲了pom中常用的标签 1 常用的标签 2 非常用的标签 1 常用的标签 a 坐标 groupid 反写公司网址+项目名 artifactId 项目名+模块名 version 版本号:3位版本 ...
- 缩小javascript文件大小之缩编、混淆
写前端的相信都遇到过要提高网页的性能,其中javascript文件越小,浏览器的下载速度面对文件的读取和解析就更快.而一般我们在开发又需要一定的代码规范来使我们的代码更加的容易维护和读懂,但是大量空格 ...
- [原创]在Windows Server 2019上配置NAS
序言 此教程安装的都是最新版本的.由于是当NAS让它非常稳定的运行,所以能不安装的软件尽量不要安装. 一.准备工作 [更新系统] 没啥,就他喵想用个最新的. 右键点击开始键->设置->更新 ...
- MOSS2010中如何用代码给托管元数据类型的栏目赋值
最近项目中遇到如何用代码给托管元数据类型的栏目赋值问题,经过折腾,现把我的思路和实现方法共享出来,让大家一起来学习学习.相互探讨下. /// <summary> /// 托管元数据 /// ...
- 【转载】SQL执行计划
要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看的. ...
- ASP.NET Core - 初期准备
微软在前不久发布了.NET Core1.0(以下简称Core),由于项目需要开始对其进行研究,希望将自己踩过的坑和见解分享给大家. Core和Framework4.6是属于并行产品,前者侧重于跨平台的 ...
- ELF文件格式与进程地址空间的联系
http://blog.csdn.net/q_l_s/article/details/52597330 三.分析在fork产生新进程中ELF文件格式与进程地址空间的联系 1.进程的虚拟地址空间 每个程 ...
- Linux操作系统下的三种Java环境配置方法
方法1:修改/etc/profile 文件 所有用户的 shell都有权使用这些环境变量 (1)在 shell终端执行命令:vi /etc/profile (2)在 profile文件末尾加入: e ...