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

首先在写这个二维码分享海报的时候试过很多方法,比如: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);
            },
        });
相关推荐
2501_9159184111 小时前
HTTPS 代理失效,启用双向认证(mTLS)的 iOS 应用网络怎么抓包调试
android·网络·ios·小程序·https·uni-app·iphone
数字游民952712 小时前
半年时间大概上了70个web站和小程序,累计提示词超过20w
人工智能·ai·小程序·vibecoding·数字游民9527
说私域12 小时前
微商企业未来迭代的核心方向与多元探索——以链动2+1模式AI智能名片商城小程序为核心支撑
大数据·人工智能·小程序·流量运营·私域运营
276695829213 小时前
美团 小程序 mtgsig
python·小程序·node·js·mtgsig1.2·美团小程序·大众点评小程序
2501_9151063213 小时前
混合应用(Hybrid)安全加固,不依赖源码对成品 IPA 混淆
android·安全·小程序·https·uni-app·iphone·webview
00后程序员张14 小时前
无需越狱,来对 iOS 设备进行调试、管理与分析
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张14 小时前
在 iOS 上架中如何批量方便快捷管理 Bundle ID
android·ios·小程序·https·uni-app·iphone·webview
韩立学长14 小时前
【开题答辩实录分享】以《智慧校园平台微信小程序》为例进行选题答辩实录分享
spring boot·微信小程序·小程序
CHU72903514 小时前
旧物回收小程序前端功能设计:以用户为核心构建环保便捷通道
小程序
h_654321014 小时前
微信小程序:按顺序一张图片加载完后,再加载另一张
微信小程序·小程序