weapp-qrcode-canvas-2d
weapp-qrcode-canvas-2d 是使用新版canvas-2d接口在微信小程序中生成二维码(外部二维码)的js包。canvas 2d 接口支持同层渲染且性能更佳,建议切换使用,可大幅提升生成图片的速度。
仓库地址
测试环境
- 微信小程序基础库版本:2.10.4
- 开发者工具版本:Stable 1.03.2101150
Usage
先在 wxml 文件中,创建绘制的 canvas
,并定义好 width
, height
, id
, type
,其中type的值必须为2d
<canvas type="2d" style="width: 260px; height: 260px;" id="myQrcode"></canvas>
安装方法1:直接引入 js 文件
直接引入 js 文件,使用 drawQrcode()
绘制二维码
// 将 dist 目录下,weapp.qrcode.esm.js 复制到项目中。路径根据实际引用的页面路径自行改变
import drawQrcode from '../../utils/weapp.qrcode.esm.js'
安装方法2:npm安装
npm install weapp-qrcode-canvas-2d --save
// 然后需要在小程序开发者工具中:构建npm
import drawQrcode from 'weapp-qrcode-canvas-2d'
安装完成后调用
例子1:没有使用叠加图片
const query = wx.createSelectorQuery()
query.select('#myQrcode')
.fields({
node: true,
size: true
})
.exec((res) => {
var canvas = res[0].node
// 调用方法drawQrcode生成二维码
drawQrcode({
canvas: canvas,
canvasId: 'myQrcode',
width: 260,
padding: 30,
background: '#ffffff',
foreground: '#000000',
text: 'abc',
})
// 获取临时路径(得到之后,想干嘛就干嘛了)
wx.canvasToTempFilePath({
canvasId: 'myQrcode',
canvas: canvas,
x: 0,
y: 0,
width: 260,
height: 260,
destWidth: 260,
destHeight: 260,
success(res) {
console.log('二维码临时路径:', res.tempFilePath)
},
fail(res) {
console.error(res)
}
})
})
例子2:使用叠加图片(在二维码中加logo)
const query = wx.createSelectorQuery()
query.select('#myQrcode')
.fields({
node: true,
size: true
})
.exec((res) => {
var canvas = res[0].node
var img = canvas.createImage();
img.src = "/image/logo.png"
img.onload = function () {
// img.onload完成后才能调用 drawQrcode方法
var options = {
canvas: canvas,
canvasId: 'myQrcode',
width: 260,
padding: 30,
paddingColor: '#fff',
background: '#fff',
foreground: '#000000',
text: '123456789',
image: {
imageResource: img,
width: 80, // 建议不要设置过大,以免影响扫码
height: 80, // 建议不要设置过大,以免影响扫码
round: true // Logo图片是否为圆形
}
}
drawQrcode(options)
// 获取临时路径(得到之后,想干嘛就干嘛了)
wx.canvasToTempFilePath({
x: 0,
y: 0,
width: 260,
height: 260,
destWidth: 600,
destHeight: 600,
canvasId: 'myQrcode',
canvas: canvas,
success(res) {
console.log('二维码临时路径为:', res.tempFilePath)
},
fail(res) {
console.error(res)
}
})
};
})
API
drawQrcode([options])
options
Type: Object
参数 | 必须 | 说明 | 示例 |
---|---|---|---|
canvas | 必须 | 画布标识,传入 canvas 组件实例 | |
canvasId | 非 | 绘制的canvasId |
'myQrcode' |
text | 必须 | 二维码内容 | ‘123456789’ |
width | 非 | 二维码宽度,与canvas 的width 保持一致 |
260 |
padding | 非 | 空白内边距 | 20 |
paddingColor | 非 | 内边距颜色 | 默认与background一致 |
background | 非 | 二维码背景颜色,默认值白色 | '#ffffff' |
foreground | 非 | 二维码前景色,默认值黑色 | '#000000' |
typeNumber | 非 | 二维码的计算模式,默认值-1 | 8 |
correctLevel | 非 | 二维码纠错级别,默认值为高级,取值:{ L: 1, M: 0, Q: 3, H: 2 } |
1 |
image | 非 | 在 canvas 上绘制图片,层级高于二维码,v1.1.1+版本支持。具体使用见:例子2 | {imageResource: '', width:80, height: 80, round: true} |
canvas 斜体无效(新版旧版都无效)怎么解决?
好像有点问题,报了这个错误,不知道怎么回事,(微信小程序不怎么碰...实在是有点....难以言明心情了),版本也是调到了2.10.4,以下是报错:
VM132 WAService.js:2 thirdScriptErrormodule "utils/weapp.qrcode.esm.js" is not defined;at "pages/2vcode/2vCode" page lifeCycleMethod onReady function Error: module "utils/weapp.qrcode.esm.js" is not defined
我是把代码一股脑全部放进了onReady里面,包括引入,而且不知道为什么import引入方式错误,就改用require的方式引用了,不知道是否与这个有关
/** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { this.createV2code() }, createV2code: function () { var drawQrcode = require('../../utils/weapp.qrcode.esm.js') console.log(drawQrcode); const query = wx.createSelectorQuery() query.select('#myQrcode') .fields({ node: true, size: true }) .exec((res) => { var canvas = res[0].node // 调用方法drawQrcode生成二维码 drawQrcode({ canvas: canvas, canvasId: 'myQrcode', width: 260, padding: 30, background: '#ffffff', foreground: '#000000', text: '大王顶真帅', }) // 获取临时路径(得到之后,想干嘛就干嘛了) wx.canvasToTempFilePath({ canvasId: 'myQrcode', canvas: canvas, x: 0, y: 0, width: 260, height: 260, destWidth: 260, destHeight: 260, success(res) { console.log('二维码临时路径:', res.tempFilePath) }, fail(res) { console.error(res) } }) }) },
报这个错误扫码原因啊这个地方
为啥 切换显示与隐藏后,cavas就不显示了。
楼主我用了你的代码好像无用啊
页面内容多,有滚动条时,划动二维码位置会错乱,有人遇到了没,要怎么解决
页面内容多,有滚动条时,划动二维码位置会错乱
var canvas = res[0].node
这行代码会报错,res为null
请问如何解决啊
我再canvas标签里加了个wx:if语句就会报这个错
或者canvas外面包了两层view标签也会报错
最近又有个新bug,电脑上调试的时候是可以成功生成二维码的,但是在真机调试的时候就报错,我看好多人都遇到这个问题了,不知道是不是小程序工具的问题。
这个工具有点小毛病,建议大家下载源码,然后自己改动源码
楼主你好,,我想问一下text这个参数可以传一个页面的地址吗,,我想要分享一个带操作的页面,试了一下text传页面地址是不生效的
https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html