微信小程序实现二维码海报保存分享功能

news2024/12/23 21:41:20

首先在写这个二维码分享海报的时候试过很多方法,比如:canvas中的这个createCanvasContext创建上下文的方法,去网上一搜就是一大堆,但其实这个方法已经被废弃了。Canvas 实例,可通过 SelectorQuery 获取。这是绘制背景图的时候用到的这个方法,下面首先看我的二维码是如何实现的。

二维码的话我是使用qrcode库来绘制的,首先需要下载一个weapp.qrcode.esm文件,然后在我需要绘制二维码页面的js中引入。

绘制二维码也可以去参考一下这位博主写的博客下载引入的文件:

微信小程序二维码快速生成库:weapp-qrcode 使用指南及问题解决方案-CSDN博客

import QRCode from '../weapp.qrcode.esm';

然后引入进去之后先写我们的wxml,绘制二维码的canvas需要设置canvas-id,这个不能相同

<!--pages/qrcode/index.wxml-->
<view>
    <!-- 顶部导航栏样式 -->
    <view class="top">
        <view class="round" bind:tap="targetHouse">
            <image src="http://lzh.yzwdblzs.xyz/img/houseThree.png" alt="" />
        </view>
    </view>
    <view class="big" bindlongpress="saveQrcode">
        <!-- 二维码 -->
        <view style="margin-left: -700px;position: absolute;">
            <canvas canvas-id="myQrcode" style="width: 200px; height: 200px;background-color: azure;"></canvas>
        </view>
        <!-- 绘制的背景图 -->
        <canvas type="2d" id="newQrcode" style="width: 350px;height: 700px;margin-top: 100px;"></canvas>
        <!-- 背景图上的二维码 -->
        <canvas canvas-id="newsQrcode" style="position: absolute;z-index: 3;"></canvas>
    </view>
</view>

在onReady里初始化二维码,是因为在我们刚打开页面的时候二维码就已经可以绘制出来

// 初始化二维码
QRCode({
    width: 200,
    height: 200,
    canvasId: 'myQrcode',
    colorDark: '#000000',
    colorLight: '#ffffff',
    text: 'https://github.com/yingye',//二维码绘制的具体内容
})

绘制成功后将生成文件的tempFilePath具体路径(本地路径)

// 保存二维码为临时路径
        wx.canvasToTempFilePath({
            canvasId: 'myQrcode',
            success(res) {
                console.log('二维码路径:', res);
                const tempQrcodePath = res.tempFilePath;
                console.log(tempQrcodePath);
                wx.createSelectorQuery().select('#newQrcode')
                    .fields({
                        node: true,
                        size: true
                    })
                    .exec((res) => {
                        textCanvas = res[0].node; // 获取 canvas 节点
                        let textCtx = textCanvas.getContext('2d'); // 重点2
                        /**至此,textCanvas,textCtx已经成功获取到,下面代码为绘图测试代码可根据自己需要修改**/
                        const dpr = wx.getSystemInfoSync().pixelRatio; // 获取设备像素比
                        console.log(dpr);
                        textCanvas.width = res[0].width * dpr
                        textCanvas.height = res[0].height * dpr
                        textCtx.scale(1, 1)
                        textCtx.fillRect(0, 0, 100, 100)
                        textCtx.clearRect(0, 0, textCanvas.width, textCanvas.height)
                        textCtx.beginPath();
                        const bg = textCanvas.createImage();
                        bg.src = 'http://lzh.yzwdblzs.xyz/img/noName.png';
                        console.log(bg);
                        bg.onload = () => {
                            console.log('背景图加载成功');
                            // 图片加载完成后,绘制背景图
                            // 如果背景图过大,按比例缩放绘制
                            const bgWidth = bg.width;
                            const bgHeight = bg.height;
                            // 计算缩放比例
                            const scaleX = textCanvas.width / bgWidth;
                            const scaleY = textCanvas.height / bgHeight;
                            const scale = Math.max(scaleX, scaleY); // 选择最大的比例以适应 canvas
                            // 计算背景图绘制的尺寸
                            const drawWidth = bgWidth * scale;
                            const drawHeight = bgHeight * scale;
                            // 绘制背景图
                            textCtx.drawImage(bg, 0, 0, drawWidth, drawHeight);
                            // 然后再绘制二维码
                            // 加载二维码图像
                            const qrImage = textCanvas.createImage();
                            qrImage.src = tempQrcodePath; // 使用临时路径
                            qrImage.onload = () => {
                                console.log('二维码加载成功');
                                // 设置二维码绘制位置(居中)
                                const qrWidth = 560; // 二维码宽度
                                const qrHeight = 600; // 二维码高度
                                const qrX = (textCanvas.width - qrWidth + 30) / 2; // 水平居中
                                const qrY = (textCanvas.height - qrHeight + 750) / 2; // 垂直居中
                                // 绘制二维码到背景图上
                                textCtx.drawImage(qrImage, qrX, qrY, qrWidth, qrHeight);
                            }
                        }
                    })
            },
            fail(err) {
                console.error('获取临时文件失败', err);
            },
        });

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

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

相关文章

ZED-OpenCV项目运行记录

项目地址&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 使用 ZED 立体相机与 OpenCV 进行图像处理和深度感知 • 使用 ZED 相机和 OpenCV 库捕获图像、深度图和点云。 • 提供保存并排图像、深度图和点云的功能。 • 允许在不同格式之间切换保存的深度图和点云…

Nacos 3.0 考虑升级到 Spring Boot 3 + JDK 17 了!

Nacos 由阿里开源&#xff0c;是 Spring Cloud Alibaba 中的一个重要组件&#xff0c;主要用于发现、配置和管理微服务。 由于 Spring Boot 2 的维护已于近期停止&#xff0c;Nacos 团队考虑升级到 Spring Boot 3 JDK 17&#xff0c;目前正在征求意见和建议。 这其实是一件好…

(css)鼠标移入或点击改变背景图片

(css)鼠标移入或点击改变背景图片 html <div class"mapTip"><divv-for"(item, index) of legendList":key"index"class"mapTipOne":class"{ active: change index }"click"legendHandle(item, index)"…

Grad-CAM-模型可视化分析方法

模型的可视化分析对于理解模型的行为有很好的辅助作用&#xff0c;能够让人们更容易理解神经网络的决策过程。 Grad-CAM&#xff08;Gradient-weighted Class Activation Mapping&#xff09;是一种用于解释卷积神经网络&#xff08;CNN&#xff09;决策过程的方法&#xff0c;…

常见八股文03

35.autowired、qualifier和Resource区别 Autowired&#xff1a;基于类型的注入 Qualifier&#xff1a;基于名称进行注入 Resource:按名称装配注入&#xff0c;如果找不到与名称匹配的bean&#xff0c;则按类型装配注入&#xff0c;可以用于字段和方法上 36.代理模式 动态代…

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法流程 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行…

redis开发与运维-redis02-redis数据类型与命令总结

文章目录 【README】【1】redis通用命令与数据结构【1.1】通用命令【1.2】数据结构与内部编码【1.3】redis单线程架构【1.3.1】redis单线程优缺点 【2】字符串&#xff08;值的类型为字符串&#xff09;【2.1】常用命令【2.1.1】设置值【2.1.2】获取值【2.1.3】批量设置值【2.1…

机器学习《西瓜书》学习笔记《待续》

如果说&#xff0c;计算机科学是研究关于“算法”的学问&#xff0c;那么机器学习就是研究关于“学习算法”的学问。 目录 绪论引言基本术语 扩展向量的张成-span使用Markdown语法编写数学公式希腊字母的LaTex语法插入一些数学的结构插入定界符插入一些可变大小的符号插入一些函…

电脑开机提示error loading operating system怎么修复?

前一天电脑还能正常运行&#xff0c;但今天启动时却显示“Error loading operating system”&#xff08;加载操作系统错误&#xff09;。我已经仔细检查了硬盘、接线、内存、CPU和电源&#xff0c;确认这些硬件都没有问题。硬盘在其他电脑上可以正常使用&#xff0c;说明不是硬…

git企业开发的相关理论(一)

目录 一.初识git 二.git的安装 三.初始化/创建本地仓库 四.配置用户设置/配置本地仓库 五.认识工作区、暂存区、版本库 六.添加文件__场景一 七.查看 .git 文件/添加到本地仓库后.git中发生的变化 1.执行git add后的变化 index文件&#xff08;暂存区&#xff09; lo…

Linux网络——网络基础

Linux网络——网络基础 文章目录 Linux网络——网络基础一、计算机网络的发展背景1、网络的定义&#xff08;1&#xff09; 独立模式&#xff08;2&#xff09;网络互联 2、局域网 LAN3、广域网 WAN4、比较局域网和广域网5、扩展 —— 域域网和互联网 二、协议1、协议的概念2、…

react中实现导出excel文件

react中实现导出excel文件 一、安装依赖二、实现导出功能三、自定义列标题四、设置列宽度五、样式优化1、安装扩展库2、设置样式3、扩展样式功能 在 React 项目中实现点击按钮后导出数据为 Excel 文件&#xff0c;可以使用 xlsx 和 file-saver 这两个库。 一、安装依赖 在项目…

7-Zip 加密功能使用教程:如何设置密码保护压缩文件

压缩包如何加密&#xff1f;7-Zip 是一款开源的文件归档工具&#xff0c;支持多种压缩格式&#xff0c;并提供了对压缩文件进行加密的功能。使用 7-Zip 可以轻松创建和解压 .7z、.zip 等格式的压缩文件&#xff0c;并且可以通过设置密码来保护压缩包中的数据不被未授权访问。 准…

[计算机网络]ARP协议的故事:小明找小红的奇妙旅程

1.ARP小故事 在一个繁忙的网络世界中&#xff0c;每个设备都有自己的身份标识——MAC地址&#xff0c;就像每个人的身份证号码一样。在这个故事里&#xff0c;我们的主角小明&#xff08;主机&#xff09;需要找到小红&#xff08;目标主机&#xff09;的MAC地址&#xff0c;才…

新版国标GB28181设备端Android版EasyGBD支持国标GB28181-2022,支持语音对讲,支持位置上报,开源在Github

经过近3个月的迭代开发&#xff0c;新版本的国标GB28181设备端EasyGBD安卓Android版终于在昨天发布到Github了&#xff0c;最新的EasyGBD支持了国标GB28181-2022版&#xff0c;还支持了语音对讲、位置上报、本地录像等功能&#xff0c;比原有GB28181-2016版的EasyGBD更加高效、…

McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构

原文链接 1 mcdonalds-technical-blog/ 原文链接 2 mcdonalds-technical-blog/ 麦当劳在异步、事务性和分析性处理用例中使用跨技术栈的事件&#xff0c;包括移动订单进度跟踪和向客户发送营销通信&#xff08;交易和促销&#xff09;。 统一事件平台&#xff08;unified eve…

【CSS in Depth 2 精译_089】15.2:CSS 过渡特效中的定时函数

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼15.2 定时函数 ✔️ 15.2.1 定制贝塞尔曲线 ✔️15.2.2 阶跃 ✔️ 15.3 非动画属性 文章目录 15.2 定时函数 Timing function…

一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器

大家好&#xff0c;今天给大家分享一个开源的自托管虚拟浏览器项目Neko&#xff0c;旨在利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器&#xff0c;为用户提供安全、私密且多功能的浏览体验。 项目介绍 Neko利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器&#xff0c;提供…

AW36518芯片手册解读(3)

接前一篇文章&#xff1a;AW36518芯片手册解读&#xff08;2&#xff09; 二、详述 3. 功能描述 &#xff08;1&#xff09;上电复位 当电源电压VIN降至预定义电压VPOR&#xff08;典型值为2.0V&#xff09;以下时&#xff0c;该设备会产生复位信号以执行上电复位操作&#x…

浅谈目前我开发的前端项目用到的设计模式

浅谈目前我开发的前端项目用到的设计模式 前言 设计模式很多&#xff0c;看到一个需求&#xff0c;项目&#xff0c;我们去开发的时候&#xff0c;肯定是做一个整体的设计进行开发&#xff0c;而在这次我项目中&#xff0c;我也做了一个整体的设计&#xff0c;为什么要设计&a…