千家信息网

怎么利用小程序的canvas来绘制二维码

发表于:2024-09-21 作者:千家信息网编辑
千家信息网最后更新 2024年09月21日,本篇文章给大家分享的是有关怎么利用小程序的canvas来绘制二维码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在微信小程序的业务中会有
千家信息网最后更新 2024年09月21日怎么利用小程序的canvas来绘制二维码

本篇文章给大家分享的是有关怎么利用小程序的canvas来绘制二维码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

在微信小程序的业务中会有一些需要展示二维码的场景。静态二维码可以直接存放在本地,使用图片方式展示,但不适合根据用户相关信息生成动态的二维码。下面将介绍下利用小程序的canvas能力绘制二维码。

1 方法一:通过wx-qr直接生成

1.1 DEMO

微信开发者工具打开查看


# 通过 npm 安装

1.2 安装

npm i wx-qr -S# 通过 yarn 安装yarn add wx-qr

1.3 使用组件

首先在你所开发的小程序根目录 app.json 或需要使用该组件的 xxx.json 中引用组件

(注意:请不要将组件命名为 wx-xxx 开头,可能会导致微信小程序解析 tag 失败 )

{  "usingComponents": {    "qr-container": "wx-qr"  }}

之后就可以在 wxml 中直接使用组件

Page({    data: {        qrTxt: 'https://github.com/liuxdi/wx-qr',    },});

当然,还可以支持很多种配置,详见github 或者 码云文档。

2. 方式二:基于QRCode.js结合canvas绘制

2.0 二维码的组成部分

定位图案
  • Position Detection Pattern是定位图案,用于标记二维码的矩形大小。这三个定位图案有白边叫Separators for Postion Detection Patterns。之所以三个而不是四个意思就是三个就可以标识一个矩形了。

  • Timing Patterns也是用于定位的。原因是二维码有40种尺寸,尺寸过大了后需要有根标准线,不然扫描的时候可能会扫歪了。

  • Alignment Patterns 只有Version 2以上(包括Version2)的二维码需要这个东东,同样是为了定位用的。

功能性数据
  • Format Information 存在于所有的尺寸中,用于存放一些格式化数据的。

  • Version Information 在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。

数据码和纠错码
  • 除了上述的那些地方,剩下的地方存放 Data Code 数据码 和 Error Correction Code 纠错码。

2.1 引入二维码数据生成库

复制qrcode.js至你的小程序相应目录。

2.2 小程序中建立canvas标签,并给canvas设置长宽

2.3获取canvas实例及上下文

const query = this.createSelectorQuery();let dpr = wx.getSystemInfoSync().pixelRatio;query.select('#qr').fields({ node: true, size: true, id: true })  .exec((res) => {    let { node: canvas, height, width } = res[0];    let ctx = canvas.getContext('2d');    canvas.width = width * dpr    canvas.height = height * dpr    ctx.scale(dpr, dpr);  })

2.4 定义一些变量及绘制二维码的数据码区

其中QRCodeModel是从qrCode.js中导入的

// 二维码的颜色const colorDark = '#000';// 获取二维码的大小,因css设置的为750rpx,将其转为pxconst rawViewportSize = getPxFromRpx(750);// 二维码容错率{ L: 1, M: 0, Q: 3, H: 2 }const correctLevel = 0;// 创建二维码实例对象,并添加数据进行生成const qrCode = new QRCodeModel(-1, correctLevel);qrCode.addData(url);qrCode.make();// 每个方向的二维码数量const nCount = qrCode.moduleCount;// 计算每个二维码方块的大小const nSize = getRoundNum(rawViewportSize / nCount, 3)// 每块二维码点的大小比例const dataScale = 1;// 计算出dataScale不为1时,每个点的偏移值const dataXyOffset = (1 - dataScale) * 0.5;// 循环行列绘制数据码区for (let row = 0; row < nCount; row++) {  for (let col = 0; col < nCount; col++) {    // row 和 col 处的模块是否是黑色区    const bIsDark = qrCode.isDark(row, col);    // 是否是二维码的图案定位标识区 Position Detection Pattern(如本模块,是三个顶点位置处的大方块)    const isBlkPosCtr = (col < 8 && (row < 8 || row >= nCount - 8)) || (col >= nCount - 8 && row < 8);    // 是否是Timing Patterns,也是用于协助定位扫描的    const isTiming = (row == 6 && col >= 8 && col <= nCount - 8) || (col == 6 && row >= 8 && row <= nCount - 8);    // 如果是这些区域 则不进行绘制    let isProtected = isBlkPosCtr || isTiming;    // 计算每个点的绘制位置(left,top)    const nLeft = col * nSize + (isProtected ? 0 : dataXyOffset * nSize);    const nTop = row * nSize + (isProtected ? 0 : dataXyOffset * nSize);    // 描边色、线宽、填充色配置    ctx.strokeStyle = colorDark;    ctx.lineWidth = 0.5;    ctx.fillStyle = bIsDark ? colorDark : "rgba(255, 255, 255, 0.6)";    // 如果不是标识区,则进行绘制    if (!isProtected) {      ctx.fillRect(        nLeft,        nTop,        (isProtected ? (isBlkPosCtr ? 1 : 1) : dataScale) * nSize,        (isProtected ? (isBlkPosCtr ? 1 : 1) : dataScale) * nSize      );    }  }}

此时已经绘制出二维码的数据码区:

2.5 绘制图形识别区

// 绘制Position Detection Patternctx.fillStyle = colorDark;ctx.fillRect(0, 0, 7 * nSize, nSize);ctx.fillRect((nCount - 7) * nSize, 0, 7 * nSize, nSize);ctx.fillRect(0, 6 * nSize, 7 * nSize, nSize);ctx.fillRect((nCount - 7) * nSize, 6 * nSize, 7 * nSize, nSize);ctx.fillRect(0, (nCount - 7) * nSize, 7 * nSize, nSize);ctx.fillRect(0, (nCount - 7 + 6) * nSize, 7 * nSize, nSize);ctx.fillRect(0, 0, nSize, 7 * nSize);ctx.fillRect(6 * nSize, 0, nSize, 7 * nSize);ctx.fillRect((nCount - 7) * nSize, 0, nSize, 7 * nSize);ctx.fillRect((nCount - 7 + 6) * nSize, 0, nSize, 7 * nSize);ctx.fillRect(0, (nCount - 7) * nSize, nSize, 7 * nSize);ctx.fillRect(6 * nSize, (nCount - 7) * nSize, nSize, 7 * nSize);ctx.fillRect(2 * nSize, 2 * nSize, 3 * nSize, 3 * nSize);ctx.fillRect((nCount - 7 + 2) * nSize, 2 * nSize, 3 * nSize, 3 * nSize);ctx.fillRect(2 * nSize, (nCount - 7 + 2) * nSize, 3 * nSize, 3 * nSize);// 绘制Position Detection Pattern 完毕// 绘制Timing Patternsconst timingScale = 1;const timingXyOffset = (1 - timingScale) * 0.5;for (let i = 0; i < nCount - 8; i += 2) {  _drawDot(ctx, 8 + i, 6, nSize, timingXyOffset, timingScale);  _drawDot(ctx, 6, 8 + i, nSize, timingXyOffset, timingScale);}// 绘制Timing Patterns 完毕

这时候,一个朴素的二维码就绘制成功啦~

以上就是怎么利用小程序的canvas来绘制二维码,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

二维 二维码 数据 程序 定位 组件 三个 图案 大小 生成 尺寸 标识 位置 信息 区域 地方 实例 就是 方块 方式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 人事资源有没有共同数据库 保持服务器上程序运行状态 对计算机网络技术的建议 郑州高新区网络安全科技馆通讯 联通宽带网络安全检测 算法题服务器管理 徐州计算机网络技术收费标准 网络安全法与网络谣言 网络安全大赛有国家队吗 数据库设计与实现专业 辽宁一对一软件开发 ipad显示链接服务器出错 专升本网络安全工程专业 软件开发周期如何估算 网络技术不断进步还有隐私吗 绍兴物流软件开发项目 ftb服务器怎么打开 数据库系统陆鑫答案 宿迁网络安全资质申请 如何做好公安网络安全 天津特种网络技术服务推广 如何往服务器虚拟机安装软件 c 数据库查询多行语句 软件开发专业申请博士 悉杭州边锋网络技术有限公司 公有云更新服务器 国防与网络安全 欣网互联网络科技是培训机构 帝国神话搜不到官方服务器 大连大象无形网络技术外汇
0