PHP生成二维码+二维码包含logo图片展示

news2024/7/6 20:07:37

composer require chillerlan/php-qrcode

用到的扩展自己安装(注:只生成二维码只要开gd扩展就行)
在这里插入图片描述
在这里插入图片描述
仅生成二维码看这个:

use chillerlan\QRCode\QRCode;

    public function QRCode()
    {
        $qrcode = new QRCode();
        $url = "http://www.******.com/demo?id=".$id;
        $response = $qrcode->render($url);

        return Tools::showJsonMsg('success','操作成功','',$response);
    }

生成二维码包含logo图片(代码仅供参考,逻辑按照自己的写)

二维码展示大概这样

在这里插入图片描述

use chillerlan\QRCode\QRCode;
 public function QRCode()
    {
        $aid = $this->request->getPost('aid');
        $imgPath = 'uploads/admin/qrcode/'.$aid.'.png';
        if (file_exists($imgPath)){
            return Tools::showJsonMsg('success','操作成功','',$imgPath);
        }

        if (!$aid) {
            return Tools::showJsonMsg("error", "id不存在");
        }
     
        $One = $this->agentModel->where(["aid" => $aid])->first();
        if (!$One) {
            return Tools::showJsonMsg("error", "不存在");
        }

        $qrcode = new QRCode(new QROptions([
            'version' => 4, // 设置二维码的版本,版本越高,二维码越大
            'scale'=>10 //二维码大小
        ]));

        $url = "http://www.******.com/demo?id=".$aid;
        $response = $qrcode->render($url);

        // 将SVG格式的二维码数据转换为PNG格式
        $svgData = str_replace('data:image/svg+xml;base64,', '', $response);
        $decodedSvgData = base64_decode($svgData);
        $imagick = new \Imagick();
        // 读取SVG数据
        $imagick->readImageBlob($decodedSvgData);
        // 设置输出格式为PNG
        $imagick->setImageFormat('png');
        // 将SVG转换为PNG并获取转换后的数据
        $pngData = $imagick->getImageBlob();
        // 创建PNG图像资源
        $pngImage = imagecreatefromstring($pngData);

        // 要插入的 Logo 图片路径
        $logoPath = 'theme/admin/img/logo.png';
        // 创建 Logo 图片资源
        $logo = imagecreatefrompng($logoPath);

        // 获取二维码和 Logo 的宽度和高度
        $qrCodeWidth = imagesx($pngImage);
        $qrCodeHeight = imagesy($pngImage);
        $logoWidth = imagesx($logo);
        $logoHeight = imagesy($logo);

        $combinedImage = imagecreatetruecolor(200, 200);

        // 计算缩放比例
        $scale = min(200 / $qrCodeWidth, 200 / $qrCodeHeight);

        // 计算缩放后的宽度和高度
        $newWidth = $qrCodeWidth * $scale;
        $newHeight = $qrCodeHeight * $scale;

        // 创建一个临时画布用于缩放二维码图像
        $tempImage = imagecreatetruecolor($newWidth, $newHeight);

        // 将二维码图像缩放到临时画布
        imagecopyresampled($tempImage, $pngImage, 0, 0, 0, 0, $newWidth, $newHeight, $qrCodeWidth, $qrCodeHeight);

        // 计算Logo应该放置的位置
        $logoX = ($newWidth - $logoWidth) / 2;
        $logoY = ($newHeight - $logoHeight) / 2;

        // 创建一个新的空白画布,大小为200x200
        $combinedImage = imagecreatetruecolor(200, 200);

        // 将Logo图像复制到新的画布上
        imagecopy($combinedImage, $logo, $logoX, $logoY, 0, 0, $logoWidth, $logoHeight);

        // 将缩放后的二维码图像叠加在Logo图像的上方
        imagecopymerge($combinedImage, $tempImage, 0, 0, 0, 0, $newWidth, $newHeight, 70);

        // 确保目录存在,如果不存在则创建
        $directory = 'uploads/admin/qrcode/';
        if (!file_exists($directory)) {
            mkdir($directory, 0777, true); // 创建目录
        }

        // 输出合并后的图像
        imagepng($combinedImage, $imgPath);
        // 释放内存
        imagedestroy($combinedImage);

        return Tools::showJsonMsg('success','操作成功','',$imgPath);
    }

前端你自己列表读uploads/admin/qrcode/‘.$aid.’.png这个就行

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

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

相关文章

如何利用51建模网,实现3D模型线上展示和应用?

按照下面的步骤,在51建模网上传3D模型,并编辑完成后,接下来就是如何让这些3D模型得到更好的展示、传播和应用。 一、3D内容快速分享与传播 3D模型在51建模网上传发布后,即可获得一个可分享的链接和二维码,直接分享给客…

jenkins插件之Warnings

Warnings插件,收集静态分析工具报告的编译器警告或问题,并将结果可视化。它内置了对许多编译器的支持(cpp,clang,java等)和工具(spotbugs,pmd,checkstyle,esl…

力扣226. 翻转二叉树(DFS的两种思路)

Problem: 226. 翻转二叉树 文章目录 题目描述思路复杂度Code 题目描述 思路 涉及二叉树的递归解法时往往需要考虑两种思路: 1.在递归遍历时执行题目需要的具体要求; 2.将一个大问题分解为多个小子问题 具体到本体: 思路1:遍历 先…

作业-day-240521

多点思维导图 面试题 1、项目中如何实现TCP的并发 1)、一般的TCP服务器通信,只能完成一个客户端的操作。要实现多客户端的通信,可使服务器端循环创建并收发客户端的通信。 2)、但仅循环服务器使用的情况,由于accept…

股指期权和股指期货的区别

今天期权懂带你了解股指期权和股指期货的区别。在金融衍生品市场,既有股指期货又有股指期权,期货与期权是两种不同的资产。 股指期权和股指期货的区别 权利与义务: 股指期货是一种协议,买卖双方都有义务在合约到期时按照约定的价…

CSS demo演示 20240524

说明&#xff1a;不修改父盒子的样式&#xff0c;只在子盒子上设置定位&#xff0c;让子盒子定位在父盒子右侧。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><style>…

CGAN|生成手势图像|可控制生成

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;TensorFlow入门实战&#xff5c;第3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 CGAN&#xff08;条件生成对抗网络&#xf…

项目十二:简单的python基础爬虫训练

许久未见&#xff0c;甚是想念&#xff0c;今日好运&#xff0c;为你带好运。ok&#xff0c;废话不多说&#xff0c;希望这门案例能带你直接快速了解并运用。&#x1f381;&#x1f496; 基础流程 第一步&#xff1a;安装需要用到的requests库&#xff0c;命令如下 pip inst…

Vue3实战笔记(41)—自己封装一个计时器Hooks

文章目录 前言计时器钩子总结 前言 在Vue项目中&#xff0c;封装一个计时器挂钩&#xff08;Hook&#xff09;是一种实用的技术&#xff0c;它允许你在组件中方便地管理定时任务&#xff0c;如倒计时、计时器等&#xff0c;而无需在每个使用场景重复编写相同的逻辑代码。 计时…

uniapp如何使用自定义的图标

http://t.csdnimg.cn/8KenC 以上是原文章,下面内容是从这篇文章转发的 一、导入 1.在官方&#xff08;iconfont-阿里巴巴矢量图标库&#xff09;选择自己想要的图标&#xff0c;加入购物车 2. 在点击购物车下载代码 3.解压文件夹 并更改名字 4.将文件夹&#xff08;iconfont&…

Xline社区会议Call Up|在 CURP 算法中实现联合共识的安全性

为了更全面地向大家介绍Xline的进展&#xff0c;同时促进Xline社区的发展&#xff0c;我们将于2024年5月31日北京时间11:00 p.m.召开Xline社区会议。 欢迎您届时登陆zoom观看直播&#xff0c;或点击“阅读原文”链接加入会议&#xff1a; 会议号: 832 1086 6737 密码: 41125…

软件开发成本估算 5大注意事项

一般来说&#xff0c;软件开发成本估算分为&#xff1a;软件规模估算、工作量估算、成本估算和确定软件开发成本等四个过程&#xff0c;其估算基本流程如下&#xff1a; 软件开发成本估算流程 为了进一步确保估算的准确性&#xff0c;提高资源规划和分配效率&#xff0c;确保软…

Redis篇 在linux系统上安装Redis

安装Redis 在Ubuntu上安装Redis 在Ubuntu上安装Redis 在linux系统中,我们安装Redis,必须先使它有root权限. 那么在linux中,如何切换到root用户权限呢? sudo su 就可切换到用户权限了. 在切换到用户权限后,我们需要用一条命令来搜索Redis相关的软件包 apt search redis 会出现非…

Labelme自定义数据集COCO格式【实例分割】

参考博客 labelme标注自定义数据集COCO类型_labelme标注coco-CSDN博客 LabelMe使用_labelme中所有的create的作用解释-CSDN博客 1制作自己的数据集 1.1labelme安装 自己的数据和上面数据的区别就在于没有.json标签文件&#xff0c;所以训练自己的数据关键步骤就是获取标签文…

x264 码率控制原理:rate_estimate_qscale 函数

rate_estimate_qscale 函数 原理 函数功能:根据目前使用的实际比特数更新一帧的qscale;是一个复杂的决策过程,需要考虑多种因素,如帧类型、编码的复杂度、目标比特率、缓冲区大小等,以确保视频质量和文件大小之间的平衡。函数参数分析:x264_t *h :编码器上下文信息结构…

UDEV规则配置usb摄像头

参考自:【linux】linux下摄像头设置固定的设备名-udev_linux 摄像头的设备文件名-CSDN博客 UDEV规则 在Linux系统中&#xff0c;UDEV&#xff08;Userspace DEV&#xff09;是一个用于管理设备节点和/dev目录下设备文件的动态设备管理器。当你连接USB摄像头或其他USB设备时&am…

【ai】chatgpt的plugin已经废弃

发现找不到按钮,原来是要申请: https://openai.com/index/chatgpt-plugins/ 发现申请已经跳转了,好像是废弃了? 不接受新插件了,但是openai的api 是可以继续用的。 https://openai.com/waitlist/plugins/We are no longer accepting new Plugins, builders can now create…

react中的useEffect()的使用

useEffect()是react中的hook函数&#xff0c;作用是用于创建由渲染本身引起的操作&#xff0c;而不是事件的触发&#xff0c;比如Ajax请求&#xff0c;DOM的更改 首先useEffect()是个函数&#xff0c;接受两个参数&#xff0c;第一个参数是一个方法&#xff0c;第二个参数是数…

Generic Segmentation Offload(GSO)

Generic Segmentation Offload汉语意思是啥&#xff1f; Generic Segmentation Offload&#xff08;GSO&#xff09;的汉语意思是“通用分段卸载”。在网络通信中&#xff0c;GSO 是一种技术&#xff0c;用于在网络栈中将较大的传输单元分段为更小的单元&#xff0c;以提高网络…

自然语言处理实战项目29-深度上下文相关的词嵌入语言模型ELMo的搭建与NLP任务的实战

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目29-深度上下文相关的词嵌入语言模型ELMo的搭建与NLP任务的实战,ELMo(Embeddings from Language Models)是一种深度上下文相关的词嵌入语言模型,它采用了多层双向LSTM编码器构建语言模型,并通过各层LSTM的隐藏状…