今天在做项目使用到了canvas绘制二维码,发现以前的方法被弃用了。
wxml:
如果想要绘制需要将起临时存储起来,写入成功的就可以进行绘制了。(如果是点击展示二维码,最好是先将数据写到onLoad事件中,在将要绘制的东西写到点击事件中去,在点击事件中去获取数据);
js:
Page({
onReady:function () {
const query = wx.createSelectorQuery()
query.select('#myCanvas')
.fields({ node: true, size: true })
.exec((res) => {
const canvas = res[0].node
const ctx = canvas.getContext('2d')
const dpr = wx.getSystemInfoSync().pixelRatio
canvas.width = res[0].width * dpr // 获取宽
canvas.height = res[0].height * dpr // 获取高
ctx.scale(dpr, dpr)
// 到这里就可以直接绘制
let image = canvas.createImage();//创建iamge实例
image.src = '引入本地的图片背景图'; // 引入本地图片
image.onload = function () {
ctx.drawImage(image, 0, 0, 289, 370); // 背景图
}
})
绘制base64图片
// 绘制base64图片
//声明文件系统
const fs = wx.getFileSystemManager();
var times = new Date().getTime();
var codeimg = wx.env.USER_DATA_PATH + '/' + times + '.png';
//将base64图片写入
fs.writeFile({
filePath: codeimg,
data: code.slice(22), // code就是接口返回的base64数据(分割掉前面的data:image/png;base64,)
encoding: 'base64',
success: () => {
console.log(codeimg);
wx.createSelectorQuery().select('#myCanvas').fields({ node: true, size: true })
.exec((res) => {
let ctx = res[0].node.getContext('2d');//getContext返回Canvas 的绘图上下文
let canvas = res[0].node;
const bg = canvas.createImage();
bg.src = codeimg;
bg.onload = function () {
ctx.drawImage(bg, 76, 175, 140, 140);
}
})
}
});
}
})
尺寸可以根据自己的需要进行更改。
长按保存到本地(在真机测试中用bindlongtap不生效),可以换成catchlongtap。如果绘制的canvas再外面可以在渲染画布的上面声明一个变量等于this。 var _this = this;
在写入文件中设置_this.setData({_this:canvas});
fs.writeFile({
filePath: codeimg,
data: code.slice(22),
encoding: 'base64',
success: () => {
wx.createSelectorQuery().select('#myCanvas').fields({ node: true, size: true })
.exec((res) => {
let ctx = res[0].node.getContext('2d');//getContext返回Canvas 的绘图上下文
let canvas = res[0].node;
const bg = canvas.createImage();
bg.src = codeimg;
bg.onload = function () {
ctx.drawImage(bg, 76, 175, 140, 140);
}
// 设置
_this.setData({
_this: canvas
})
})
}
});
在长按保存事件中(catchlongtap),将canvas = 画布this.data._this
wx.canvasToTempFilePath({
// 把画布转化成临时文件
x: 0,
y: 0,
width: 380, // 截取的画布的宽
height: 600, // 截取的画布的高
destWidth: 380, // 保存成的画布宽度
destHeight: 600, // 保存成的画布高度
fileType: 'png', // 保存成的文件类型
quality: 1, // 图片质量
canvas: this.data._this, // 画布
success(res) {
console.log(res);
// 2-保存图片至相册
wx.saveImageToPhotosAlbum({
// 存成图片至手机
filePath: res.tempFilePath,
success(res2) {
wx.hideLoading();
wx.showToast({
title: '保存成功',
duration: 2000
});
},
fail(res3) {
if (res3.errMsg === 'saveImageToPhotosAlbum:fail auth deny') {
wx.showToast({
title: '保存失败,稍后再试',
duration: 2000,
icon: 'none'
});
wx.hideLoading();
} else {
wx.showToast({
title: '保存失败,稍后再试',
duration: 2000,
icon: 'none'
});
wx.hideLoading();
}
}
});
},
fail(err) {
console.log(err);
wx.showToast({
title: '保存失败,稍后再试',
duration: 2000,
icon: 'none'
});
wx.hideLoading();
}
});
}