PHP利用endroid/qr-code生成个性二维码

news/2024/9/21 16:00:04/文章来源:https://www.cnblogs.com/shemmor/p/18424121

需先安装拓展库

composer require endroid/qr-code


use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Label\Label;
use Endroid\QrCode\Logo\Logo;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;/*** @notes: myGenerateQrCode* @param $code_detail* @return array*/public function myGenerateQrCode($code_detail){/*$code_detail = ['qr_code_text'             => 'qr code text','qr_code_margin'           => 10,'logo_path'                => '/static/assets/images/logo.jpg','label_text'               => 'Label Text','label_text_color'         => [0, 0, 0]];*/if (!isset($code_detail['label_text_color'])) {$code_detail['label_text_color'] = [0, 0, 0];}try {$writer = new PngWriter();// Create QR code$qrCode = QrCode::create(strval($code_detail['qr_code_text']))->setEncoding(new Encoding('UTF-8'))->setErrorCorrectionLevel(new ErrorCorrectionLevelHigh())->setSize(640)->setMargin(20)->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())->setForegroundColor(new Color(0, 0, 0))->setBackgroundColor(new Color(255, 255, 255));// Create generic logoif (isset($code_detail['logo_path'])) {$logo = Logo::create('.' . $code_detail['logo_path'])->setResizeToWidth(128);} else {$logo = null;}// Create generic labelif (isset($code_detail['label_text'])) {$label = Label::create(strval($code_detail['label_text']))->setTextColor(new Color($code_detail['label_text_color'][0], $code_detail['label_text_color'][1], $code_detail['label_text_color'][2]));} else {$label = null;}$result      = $writer->write($qrCode, $logo, $label);$folder_path = '/storage/qr_code/';$file_name   = get_now_date('YmdHis') . bin2hex(random_bytes(8));$file_path   = $folder_path . $file_name . '.png';// 如果需要修改定位标// $this->myGenerateQrCodeLocator($file_path);// 如果需要渐变色// $this->myGenerateQrCodeGradient($file_path);$result->saveToFile('.' . $file_path);return ['code'      => 200,'media_url' => $folder_path . $file_name . '.png','media_uri' => get_file_url($file_path)];} catch (\Exception $e) {return ['code' => 500,'msg'  => $e->getMessage()];}}/*** @notes: 二维码菱形定位标* @param $file_path* @return void*/public function myGenerateQrCodeLocator($file_path){// 加载二维码图像$qrImage = imagecreatefrompng('.' . $file_path);$width   = imagesx($qrImage);$height  = imagesy($qrImage);// 自定义定位标志的颜色$circleBorderColor = imagecolorallocate($qrImage, 255, 255, 255); // 圆圈边框颜色(黑色)$circleFillColor   = imagecolorallocate($qrImage, 0, 0, 0);       // 圆圈填充颜色(白色)$diamondColor      = imagecolorallocate($qrImage, 0, 0, 0);       // 菱形颜色(黑色)$squareColor       = imagecolorallocate($qrImage, 255, 255, 255); // 正方形颜色(红色)// 绘制自定义定位标志function drawMarker($image, $x, $y, $circleBorderColor, $circleFillColor, $diamondColor, $squareColor){imageantialias($image, true);// 绘制正方形imagefilledrectangle($image, $x - 90, $y - 90, $x + 90, $y + 90, $squareColor);// 绘制圆圈填充imagefilledellipse($image, $x, $y, 160, 160, $circleFillColor);   // 增加直径// 绘制圆圈边框imagefilledellipse($image, $x, $y, 100, 100, $circleBorderColor); // 增加直径// 绘制菱形$diamondPoints = [$x, $y - 30, // 上$x + 30, $y, // 右$x, $y + 30, // 下$x - 30, $y  // 左];imagefilledpolygon($image, $diamondPoints, 4, $diamondColor);}// 定位标志的位置$markerPositions = [[105, 105],           // 左上角[105, $height - 135], // 左下角[$width - 105, 105]   // 右上角];// 绘制定位标志foreach ($markerPositions as $position) {drawMarker($qrImage, $position[0], $position[1], $circleBorderColor, $circleFillColor, $diamondColor, $squareColor);}// 保存最终带自定义定位标志的二维码imagepng($qrImage, '.' . $file_path, 9);// 清理内存imagedestroy($qrImage);}/*** @notes: 二维码渐变颜色* @param $file_path* @return void*/public function myGenerateQrCodeGradient($file_path){// 加载二维码图像$qrImage = imagecreatefrompng('.' . $file_path);$width   = imagesx($qrImage);$height  = imagesy($qrImage);// 创建空白图像$gradientImage = imagecreatetruecolor($width, $height);// 创建渐变色for ($y = 0; $y < $height; $y++) {$r     = (int)(255 * ($y / $height));  // 红色渐变$g     = 0;$b     = (int)(255 * (1 - $y / $height));  // 蓝色渐变$color = imagecolorallocate($gradientImage, $r, $g, $b);imageline($gradientImage, 0, $y, $width, $y, $color);}// 合成渐变背景和二维码for ($x = 0; $x < $width; $x++) {for ($y = 0; $y < $height; $y++) {$pixelColor = imagecolorat($qrImage, $x, $y);$rgba       = imagecolorsforindex($qrImage, $pixelColor);// 如果是黑色,则替换为渐变色if ($rgba['red'] == 0 && $rgba['green'] == 0 && $rgba['blue'] == 0) {$colorAtGradient = imagecolorat($gradientImage, $x, $y);imagesetpixel($qrImage, $x, $y, $colorAtGradient);}}}// 保存最终带渐变色的二维码imagepng($qrImage, '.' . $file_path);// 清理内存imagedestroy($qrImage);imagedestroy($gradientImage);}

  

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

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

相关文章

C 风格字符串函数

▲《C++ Primer》 P109 我们无法保证 c_str 函数返回的数组一直有效,事实上,如果后续的操作改变了 string 的值就可能让之前返回的数组失去效用。 WARNING: 如果执行完 c_str() 函数后程序想一直都能使用其返回的数组,最好将该数组重新拷贝一份。

基于IDF的ESP32S3-LVGL DEMO移植

简介 ESP32-32出色的性价比,较好的性能与内存空间,可以好利用来完成GUI显示库的加载 LVGL LVGL是一款比较流行的致力于MCU与MPU创建漂亮UI的嵌入式图形库,免费且开源。 硬件 硬件采用的是正点原子的ESP32-S3 屏幕使用的是SPI通信方式,配合IO口控制(RST,A0),来实现LCD屏幕…

nginx: 按ip地址限流

一,以固定的速度提供服务 语法: 例子 limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;server { location / { limit_req zone=test; }} 语法: imit_req_zone 用于设置限流和共享内存区域的参数,格式为: limit_req_zone key zone rate。 key: 定…

Free5GC源码研究(2) - 单个NF的软件架构

前文我们总览了free5gc的总体软件架构。整一个free5gc系统又由几个NF(Network Function)组成,所以本文继续深入研究单个NF的软件架构。要研究NF的软件架构,最直接的方式是找一个简单的NF来回观摩。free5gc/ausf算是比较简单的一个,然而我发现了一个更简单的NF,叫做andy89…

一,初始 MyBatis-Plus

一,初始 MyBatis-Plus @目录一,初始 MyBatis-Plus1. MyBatis-Plus 的概述2. 入门配置第一个 MyBatis-Plus 案例3. 补充说明:3.1 通用 Mapper 接口介绍3.1.1 Mapper 接口的 “增删改查”3.1.1.1 查询所有记录3.1.1.2 插入一条数据3.1.1.3 删除一条数据3.1.1.4 更新一条数据3.…

[神经网络与深度学习笔记]LDA降维

LDA降维 LinearDiscriminant Analysis 线性判别分析,是一种有监督的线性降维算法。与PCA保持数据信息不同,LDA的目标是将原始数据投影到低维空间,尽量使同一类的数据聚集,不同类的数据尽可能分散 步骤:计算类内散度矩阵\(S_b\) 计算类间散度矩阵\(S_w\) 计算矩阵\(S_w^{-1…

C++ 指针和迭代器支持的操作

▲ 《C++ Primer》 P96 指针也都支持上面的操作。

代码整洁之道--读书笔记(14)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

hexo安装后报错hexo 不是内部或外部命令,也不是可运行的程序 或批处理文件。

hexo问题 之前利用hexo和gitee搭建了一个博客,但是最近gitee的gitpage停止服务了,便想着在github上搭建一个。 在到安装hexo这一步的时候,一直报错hexo 不是内部或外部命令,也不是可运行的程序 或批处理文件。 我的所有安装步骤和环境变量发现都没有错,反复配置后去找了一…

跑冒滴漏监测系统

跑冒滴漏监测系统应用计算机视觉和深度学习技术对危化品生产区域实时检测,当检测到液体泄露时,立即抓拍存档告警并回传给后台监控平台方便人员及时处理,提高图像数据的实时监控效率。跑冒滴漏监测系统7*24小时不间断对监控画面实时分析监测,避免意外事故发生,同时降低人力…

学校食堂明厨亮灶监控系统

学校食堂明厨亮灶监控系统通过卷积神经网络学习与图像识别技术,学校食堂明厨亮灶监控系统将对现场监控画面进行24小时实时分析,如:厨房出现老鼠狗猫、厨师未戴口罩、厨师未戴厨师帽、厨师服穿戴识别、抽烟识别、玩手机识别,同时实时抓拍相关情况,全程记录留痕,提升监管效…

河道采砂识别监测系统

河道采砂识别监测系统借助深度视觉边缘分析技术,自动对监控区域违法采砂进行实时监测。如果河道采砂识别监测系统监测到有人违法采砂时,立即抓拍存档预警,将违规采砂截图发给后台管理中心,提醒后台人员及时处理。河道采砂识别监测系统可根据时间段违规记录、视频进行查找,…