uni-app+php 生成微信二维码 分销海报

主要代码如下,可直接复制调试参数:

 //查询当前用户是否有分销海报public function user_poster(){$this->checkAuth();//查询会员信息$user = $this->getUserInfoById($this->user_id);if(!empty($user['distribution_img'])){$result['data'] = $user['distribution_img'];}else{$result = $this->getDistributorImg();}$this->success("请求成功!", $result);}//获取小程序分享二维码--分销海报public function getDistributorImg(){try{//查询会员信息$userinfo = $this->getUserInfoById($this->user_id);$url = $this->request->get('url');$save_dir = 'upload/qr_code/user_share/';$save_key = 'uid'.$userinfo['id'];$img_src = md5($save_key) . '.png';$poster_config = $this->userShareConfig();$poster_url = root_path().'public/'.$save_dir . $img_src;//生成小程序二维码$res = $this->makeUserMnpQrcode($userinfo,$save_key,$img_src);if(true !== $res){return ['status' => 0, 'msg' => '微信配置错误:'.$res, 'data' => ''];}$background_img = root_path().'public/images/share_user_bg.png';$user_avatar =  root_path().'public/images/default_logo.jpg';$qr_code_logic = new MemberController();//获取背景图$share_background_img = imagecreatefromstring(file_get_contents($background_img));//合成头像$qr_code_logic->writeImg($share_background_img, $user_avatar, $poster_config['head_pic'],true);//合成昵称$nickname = self::filterEmoji($userinfo['nickname']);$qr_code_logic->writeText($share_background_img, $nickname, $poster_config['nickname']);//长按识别$notice = '长按识别二维码 >>';$qr_code_logic->writeText($share_background_img, $notice, $poster_config['notice']);//合成商品标题$title = self::auto_adapt($poster_config['title']['font_size'], 0, $poster_config['title']['font_face'], '邀请你一起来赚大钱', $poster_config['title']['w'],$poster_config['title']['y'],getimagesize($background_img));$qr_code_logic->writeText($share_background_img, $title, $poster_config['title']);//邀请码$qr_code_logic->writeText($share_background_img, '邀请码 '.$userinfo['distribution_code'], $poster_config['code_text']);//合成二维码$qr_code_logic->writeImg($share_background_img, $poster_url, $poster_config['qr'],false);imagepng($share_background_img, $poster_url);$file_name = 'public/'.$save_dir . $img_src;$result['data'] = $file_name;$dis_oss_img = $this->local_upload($result['data']);//更新会员分销海报信息$dis_oss_img = cmf_get_asset_url($dis_oss_img);$this->up_member(['distribution_img' => $dis_oss_img]);//上传oss$result['data'] = $dis_oss_img;return $result;}catch(Exception $e){return ['status' => 0, 'msg' => $e->getMessage(), 'data' => ''];}}public function up_member($params){$this->checkAuth();$this->MemberModel = new MemberModel();$params['update_time'] = time();$member                = $this->getUserInfoByOpenid($this->openid);if (empty($member)) $this->error("该会员不存在!");$result = $this->MemberModel->where('id', $member['id'])->strict(false)->update($params);if ($result) {$result = $this->getUserInfoById($this->user_id);return true;} else {return false;}}

需要引用的方法

/** 生成海报自动适应标题*/
public function auto_adapt($size, $angle = 0, $fontfile, $string, $width, $height, $bg_height)
{$content = "";// 将字符串拆分成一个个单字 保存到数组 letter 中for ($i = 0; $i < mb_strlen($string); $i++) {$letters[] = mb_substr($string, $i, 1);}foreach ($letters as $letter) {$str = $content . " " . $letter;$box = imagettfbbox($size, $angle, $fontfile, $str);$total_height = $box[1] + $height;if ($bg_height[1] - $total_height < $size) {break;}//右下角X位置,判断拼接后的字符串是否超过预设的宽度if (($box[2] > $width) && ($content !== "")) {if ($bg_height[1] - $total_height < $size * 2) {break;}$content .= "\n";}$content .= $letter;}return $content;
}//写入文字public function writeText($poster, $text, $config){$font_uri = $config['font_face'];$font_size = $config['font_size'];$color = substr($config['color'],1);//颜色转换$color= str_split($color, 2);$color = array_map('hexdec', $color);if (empty($color[3]) || $color[3] > 127) {$color[3] = 0;}//写入文字$font_col = imagecolorallocatealpha($poster, $color[0], $color[1], $color[2], $color[3]);imagettftext($poster, $font_size,0, $config['x'], $config['y'], $font_col, $font_uri, $text);return $poster;}
/*** Notes:去掉名称中的表情* @param $str* @return string|string[]|null* @author: cjhao 2021/3/29 15:56*/
public function filterEmoji($str)
{$str = preg_replace_callback('/./u',function (array $match) {return strlen($match[0]) >= 4 ? '' : $match[0];},$str);return $str;
}public function makeUserMnpQrcode($userinfo,$save_key,$img_src) {try {$config = cmf_get_option('weipay');$wechatC['app_id'] = $config['wx_mini_app_id'];$wechatC['secret'] = $config['wx_mini_app_secret'];$app = Factory::miniProgram($wechatC);$code = $userinfo['distribution_code']; //邀请码$response = $app->app_code->get('pages/index/index'.'?invite_code='.$code, ['width' => 170,]);if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) {$response->saveAs('upload/qr_code/user_share/', $img_src);return true;}if(isset($response['errcode']) && 41030 === $response['errcode']){return '商城小程序码,先提交审核并通过';}return $response['errmsg'];} catch (\EasyWeChat\Kernel\Exceptions\Exception $e){return $e->getMessage();}}//写入图片public function writeImg($poster, $img_uri, $config, $is_rounded = false){$pic_img = imagecreatefromstring(file_get_contents($img_uri));$is_rounded?$pic_img = self::rounded_corner($pic_img):'';//切成圆角返回头像资源$pic_w = imagesx($pic_img);$pic_h = imagesy($pic_img);//圆形头像大图合并到海报imagecopyresampled($poster, $pic_img,$config['x'],$config['y'],0, 0,$config['w'],$config['h'],$pic_w,$pic_h);return $poster;}/*** 将图片切成圆角*/
public function rounded_corner($src_img)
{$w = imagesx($src_img);//微信头像宽度 正方形的$h = imagesy($src_img);//微信头像宽度 正方形的$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);}}}unset($src_img);return $img;
}//用户图片配置public function userShareConfig(){return [//会员头像'head_pic' => ['w' => 80, 'h' => 80, 'x' => 30, 'y' => 680,],//会员昵称'nickname' => ['color' => '#333333', 'font_face' => root_path().'public/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'x' => 120, 'y' => 730,],//标题'title' => ['color' => '#333333', 'font_face' => root_path().'public/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'w' => 360, 'x' => 30, 'y' => 810,],//提醒长按扫码'notice' => ['color' => '#333333', 'font_face' => root_path().'public/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'x' => 30, 'y' => 880,],//邀请码文本'code_text' => ['color' => '#FF2C3C', 'font_face' => root_path().'public/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'x' => 355, 'y' => 930,],//二维码'qr' => ['w' => 170,'h' => 170, 'x' => 370, 'y' => 730,],];}

最终效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)

在本篇文章中&#xff0c;我们将详细解读力扣第170题“两数之和 III - 数据结构设计”。通过学习本篇文章&#xff0c;读者将掌握如何设计一个数据结构来支持两种操作&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解&#xff0c;以便…

头歌数据结构与算法课程设计易 - 青蛙跳台阶

从前有一只青蛙想跳台阶去等峰&#xff0c;若该青蛙一次可以跳上1级台阶、也可以跳上2级、还可以跳3级。那么改青蛙从第0级台阶出发&#xff0c;在跳上第n级台阶且在第m级台阶停留过时有多少种跳法。 输入描述&#xff1a; 第一行两个正整数&#xff0c;n和m m<n 输出描述&a…

kubernetes镜像下载页,离线安装k8s的资源

kubernetes-apt-pool安装包下载_开源镜像站-阿里云 (aliyun.com) 【Kubernetes】Kubernetes各大版本的最新版本下载地址_kubet软件下载-CSDN博客

单位职员尤其女性,若你有文才那将前途无量!

单位职员尤其女性&#xff0c;若你有文才那将前途无量&#xff01; 公司职员尤其女性&#xff0c;若文才出众&#xff0c;恭喜你&#xff1a;提拔重用你是早晚的事&#xff01;不信看我给你分析-- 再说机关、企事业单位的职员&#xff0c;尤其是体制内职工&#xff0c;你若会写…

C# List

C# List 创建 List:添加元素:使用 AddRange 方法添加多个元素&#xff1a;插入元素:访问元素:移除元素:使用 Remove 方法移除一个元素&#xff1a;使用 RemoveAt 方法移除指定索引的元素&#xff1a;使用 RemoveAll 方法移除满足条件的所有元素&#xff1a; 查找元素:使用 Cont…

Goby 漏洞发布|万户ezEIP企业管理系统 /member/success.aspx 命令执行漏洞

漏洞名称&#xff1a;万户ezEIP企业管理系统 /member/success.aspx 命令执行漏洞 English Name&#xff1a;Wanhu-ez-EIP /member/success.aspx Command Execution Vulnerability CVSS core: 9.0 影响资产数&#xff1a;6175 漏洞描述&#xff1a; 万户ezEIP是一种企业资源…

在CentOS7下构建TeamSpeak服务器并增加网易云点歌插件

文章目录 部署TeamSpeak创建一个新用户下载并解压服务端下载解压 启动服务端同意许可协议启动与配置开放端口设置开机自启 客户端连接 部署TS3AudioBot并添加网易云插件安装ffmpeg下载TS3AudioBot本体与插件并解压配置TS3AudioBot启动设置开机自启 部署网易云API安装git安装Nod…

解读vue3源码-2

提示&#xff1a;看到我 请让滚去学习 vue3编译模版的提升 文章目录 vue3编译模版的提升静态节点提升补丁标志和block的使用附录&#xff1a; template explorer可以将我们的源模版转化成渲染函数代码&#xff0c;vue2中就有&#xff0c;而Vue3 template explorer 功能更加丰富…

外汇天眼:ESMA发布针对在投资服务中使用人工智能的公司的指导意见

欧洲证券和市场管理局&#xff08;ESMA&#xff09;&#xff0c;欧盟的金融市场监管机构和监督机构&#xff0c;发布了一份声明&#xff0c;为在向零售客户提供投资服务时使用人工智能技术&#xff08;AI&#xff09;的公司提供初步指导。 尽管人工智能的普及仍处于初期阶段&am…

请描述Vue常用的修饰符

在 Vue 中&#xff0c;修饰符&#xff08;Modifiers&#xff09;常用于自定义指令&#xff08;Directives&#xff09;和事件监听&#xff08;Event Listeners&#xff09;中&#xff0c;以改变指令或事件监听器的默认行为。以下是一些 Vue 中常用的修饰符&#xff1a; 1. 事件…

你认识nginx吗,nginx是做什么的,nginx可以做什么 --2)nginx配置

hello大家今天教大家如何用nginx实验tomcat的负载均衡&#xff0c;同理其他的也可以&#xff0c;如httpd等 首先需要准备一个nginx和tomcat包&#xff0c;这里用到的是版本号为 然后需要准备最少三台linux虚拟机&#xff0c;然后我们开始吧 1.安装tomcat 解包 tar zxf /mnt/…

学习 SSH Key 生成方法

SSH Key 是用于身份验证的一对密钥&#xff0c;包括公钥和私钥。公钥可以放在需要访问的服务器上&#xff0c;私钥则保留在本地。当你使用SSH连接到支持SSH Key认证的服务器时&#xff0c;服务器会用公钥来加密一个随机生成的字符串发送给客户端&#xff0c;客户端用私钥解密并…

C语言(字符和字符串函数)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…

【LeetCode 130. 被围绕的区域】

1. 题目 2. 分析 这题其实非常不错。如果正向解&#xff0c;非常麻烦&#xff1b;因为很难界定哪些O是被包围的&#xff1f;但是如果反向解呢&#xff1f;因为边界的O不会被包围&#xff0c;那么就可以想到跟边界O相连的O都不会被包围。那么除此之外的O都会被包围&#xff0c…

【sklearn | 6】无监督学习与聚类分析

在前几篇教程中&#xff0c;我们探讨了 sklearn 的基础、高级功能&#xff0c;异常检测与降维&#xff0c;时间序列分析与自然语言处理&#xff0c;模型部署与优化&#xff0c;以及集成学习与模型解释。本篇教程将专注于无监督学习和聚类分析&#xff0c;这在探索性数据分析和数…

github有趣项目:自制“我的世界” project make

videocodehttps://www.youtube.com/watch?v4O0_-1NaWnY,https://www.bilibili.com/video/BV1oj411p7qM/?https://github.com/jdah/minecraft-weekend MAKE git clone --recurse-submodules https://github.com/jdah/minecraft-weekend.git 正克隆到 minecraft-weekend... …

x264 参考帧管理源码分析

x264参考帧管理 在x264中,参考帧的管理是一个重要的组成部分,因为它涉及到视频编码过程中的帧间预测。以下是关于x264参考帧管理的一些关键点: 参考帧的分类:在x264中,帧可以分为几类,包括参考帧、当前编码帧和未使用帧等。 参考帧的作用:参考帧用于帧间预测,通过比较当…

【Qt】之【Get√】QByteArray写入txt文件、QByteArray截取数据

写入文件 QFile file(path);if (file.open(QIODevice::WriteOnly)) {// 将 QImage 保存到文件file.write(jsonData.toByteArray());// 关闭文件file.close();SCDebug << "saved to" << path;} else {SCDebug << "Failed to open file for wri…

直播分享|深入解析ts-morph:通过注释生成类型文档

♪ ♫ 你看小狗在叫 树叶会笑 风声在呢喃♫ ♪ 乘风追梦&#xff0c;童心未泯 OpenTiny 预祝所有大朋友、小朋友儿童节快乐~ 与此同时&#xff0c;OpenTiny 贡献者直播也即将开启啦~ 直播主题&#xff1a;【深入解析ts-morph&#xff1a;通过注释生成类型文档】 6月1日&am…

碳课堂|入门必看!碳足迹(CFP)主要国际标准一览

一、碳足迹概念 碳足迹&#xff08;Carbon FootPrint&#xff0c;CFP&#xff09;是用来衡量个体、组织、产品或国家在一定时间内直接或间接导致的二氧化碳排放量的指标。产品碳足迹属于碳排放核算的一种&#xff0c;一般指产品从原材料加工、运输、生产到出厂销售等流程所产生…