微信小程序 canvas 生成海报
<view>
<view><canvas type="2d" id="myCanvas" class="myCanvas"></canvas></view>
<view bindtap="savePoster">保存到相册</view>
</view>
data: {
urlCode: '/static/img/address.png',
bgImg: '/static/img/bg.jpeg',
userinfo: {
avatar: '/static/img/head_portrait .png',
nickname: '小舒'
},
goodsInfo:{
goodsImg:'<https://img.fphdcdn.com/member/2022-03-21GDxfyCSRJ6.jpg>',
goodsName:'远赴人间惊鸿宴,一睹人间盛世颜',
discountPrice:'莫等闲,白了少年头,空悲切。',
discountPrice1:'山重水复疑无路,柳暗花明又一村。'
}
},
generatePoster() {
wx.showLoading({
title: '生成海报中~~',
mask: true,
})
let slet = this;
slet.setData({
hidden: 'hidden'
})
let urlCode = slet.data.urlCode;
wx.createSelectorQuery().select('#myCanvas')
.fields({
node: true,
size: true
})
.exec(async (res) => {
const cvs = res[0].node;
let width = res[0].width;
let height = res[0].height;
cvs.width = 480;
cvs.height = 1000;
const ctx = cvs.getContext('2d');
let goodsInfo = slet.data.goodsInfo;
let userinfo = slet.data.userinfo
let avatarurl_width = 60;
let avatarurl_heigth = 60;
let avatarurl_x = 25;
let avatarurl_y = 25;
const imageData = ctx.getImageData(0, 0, cvs.width, cvs.height);
for (let i = 0; i < imageData.data.length; i += 4) {
if (imageData.data[i + 3] === 0) {
imageData.data[i] = 255;
imageData.data[i + 1] = 255;
imageData.data[i + 2] = 255;
imageData.data[i + 3] = 255;
}
}
ctx.putImageData(imageData, 0, 0);
const img1 = cvs.createImage()
console.log('img1', img1);
await new Promise(resolve => {
console.log('resolve', resolve);
img1.onload = resolve
img1.src = userinfo.avatar
})
ctx.save();
ctx.beginPath();
ctx.arc(avatarurl_width / 2 + avatarurl_x, avatarurl_heigth / 2 + avatarurl_y, avatarurl_width / 2, 0, Math.PI * 2, false);
ctx.clip();
ctx.drawImage(img1, avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth);
ctx.restore();
ctx.font = '26px 微软雅黑'
ctx.fillText(`来自[${userinfo.nickname}]的分享`, 100, 70);
const img0 = cvs.createImage()
await new Promise(resolve => {
img0.onload = resolve
img0.src = goodsInfo.goodsImg
})
ctx.drawImage(img0, 0, 120, 480, 480);
ctx.font = '21px 微软雅黑'
ctx.fillText(goodsInfo.goodsName, 30, 650);
ctx.font = '21px 微软雅黑'
ctx.fillText(`${goodsInfo.discountPrice}`, 30, 700);
ctx.font = '21px 微软雅黑'
ctx.fillText(`${goodsInfo.discountPrice1}`, 30, 750);
const img = cvs.createImage()
await new Promise(resolve => {
img.onload = resolve
img.src = urlCode
})
ctx.drawImage(img, 154, 770, 160, 160);
ctx.font = '21px 微软雅黑'
ctx.fillText('长按识别二维码', 160, 960);
wx.canvasToTempFilePath({
canvas: cvs,
success: (res) => {
wx.hideLoading();
hb_img = res.tempFilePath;
}
})
})
},
savePoster() {
let slet = this;
wx.saveImageToPhotosAlbum({
filePath: hb_img,
success: (res) => {
wx.showToast({
title: '保存成功',
icon: 'success',
duration: 1000
})
},
fail: (err) => {
}
})
},
