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.pswp.cn/bicheng/19784.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19784.shtml
英文地址,請注明出處:http://en.pswp.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;一般指產品從原材料加工、運輸、生產到出廠銷售等流程所產生…