思路:生成朋友圈海报放在公共文件,首先需要绘制canvas,点击分享朋友圈按钮,在手机屏幕看不见的地方(定位left:1000px)绘制出canvas,绘制完成将canvas转为图片显示。点击保存按钮,将本地缓存路径的图片下载到手机相册,在这里需要进行授权处理
untils.js文件
// 参数说明: mainImg 商品图 headImg 微信头像 onshareImg 二维码 goodsName 商品名称 goodsDec 商品描述 goodsTime 截图时间 goodsPrice 商品价格 callback 绘制完成回调
// 需要在小程序控制台downfile加入网络图片的域名, 否则无法显示图片
shareImgCanvas: function(mainImg, headImg, onshareImg, goodsName, goodsDec, goodsTime, goodsPrice, callback) {
var that = this
// 防止网络图片绘制失败, 将网络图片更改为本地缓存图片, 成功回调执行
let promise1 = new Promise(function(resolve, reject) {
wx.getImageInfo({
// src需要使用https网络路径
src: mainImg,
success: function(res) {
resolve(res);
}
})
});
let promise2 = new Promise(function(resolve, reject) {
wx.getImageInfo({
src: headImg,
success: function(res) {
resolve(res);
}
})
});
let promise3 = new Promise(function(resolve, reject) {
wx.getImageInfo({
src: onshareImg,
success: function(res) {
resolve(res);
}
})
});
// all接收数组作为参数, p1 p2 p3 三个返回值, 都为fulfilled执行
Promise.all([
promise1, promise2, promise3
]).then(res => {
// 创建上下文
var ctx = wx.createCanvasContext('shareImg')
// 开始绘制
ctx.beginPath();
// 列表商品都有分享朋友圈功能, 需要多次调用绘制, 每次需先清除画布重新绘制
// 清除矩形区域
ctx.clearRect(0, 0, 400, 667)
// 重新填充, 不填充无法清除画布
// ctx.fillRect(0, 0, 400, 667); (无法清除画布看情况添加)
// 开始画
ctx.beginPath();
// 填充白色
ctx.setFillStyle("#fff")
// 填充进矩形框
ctx.fillRect(0, 0, 400, 667);
// 商品图
ctx.drawImage(res[0].path, 0, 0, 400, 400)
// 二维码
ctx.drawImage(res[2].path, 290, 470, 100, 100)
// 画头像圆
ctx.arc(364, 110, 30, 0, Math.PI * 2, false);
// 切割圆, 调用fillRect后,模拟器显示切割不成功,
ctx.clip();
// 头像
ctx.drawImage(res[1].path, 335, 80, 60, 60)
// 恢复之前保存的上下文(清除画布后,文字不显示)
ctx.restore();
// 文字位置
ctx.setTextAlign('left')
// 文字颜色
ctx.setFillStyle('#666')
// 文字大小
ctx.setFontSize(20)
// 填充文字
ctx.fillText(goodsname, 20, 430)
ctx.setTextAlign('left')
ctx.setFillStyle('#aaa')
ctx.setFontSize(18)
ctx.fillText(goodsTime, 20, 470)
ctx.setTextAlign('left')
ctx.setFillStyle('#f07f45')
ctx.setFontSize(24)
ctx.fillText('¥ ' + goodsPrice, 20, 530)
// 绘制路径的边框(头像黑框)
ctx.stroke()
// 绘制到画布中,绘制成功掉生成海报图
ctx.draw(false, function() {
callback()
})
})
},
untils.js文件
生成朋友圈图
getFriendImg: function(that) {
// canvas转图片
wx.canvasToTempFilePath({
x: 0,
y: 0,
width: 400,
height: 600,
destWidth: 400,
destHeight: 600,
canvasId: 'shareImg',
success: function(res) {
// 本地临时路径
that.setData({
qrcode_src: res.tempFilePath,
})
},
fail: function(res) {
wx.showToast({
title: '加载失败,稍后再试~',
icon: "none"
})
}
})
}
保存图片前授权
// 参数说明 that 为调用处的this, callback为回调全局保存is_friendAuthor ,is_friendAuthor 是否已经授权相册, qrcode_src本地缓存路径, returncallback 失败回调
function saveImage(that, callback, is_friendAuthor, qrcode_src, returncallback) {
// 未授权
if (is_friendAuthor) {
wx.showModal({
title: '授权提示',
content: '"千真优农"要访问你的本地相册,是否允许?',
success: function(res) {
if (res.confirm) {
wx.openSetting({
success: function(res) {
// 允许授权
if (res.authSetting["scope.writePhotosAlbum"]) {
// 将允许授权全局保存
callback(false)
// 保存图片
common.saveImgPhoto(that, qrcode_src, callback, returncallback)
} else {
callback(true)
wx.showToast({
title: '保存失败',
icon: 'none'
});
returncallback()
}
}
})
} else if (res.cancel) {
callback(true)
wx.showToast({
title: '保存失败',
icon: 'none'
});
}
}
})
} else {
// 已经授权, 直接保存图片
common.saveImgPhoto(that, qrcode_src, callback, returncallback)
}
}
common文件
保存图片
// 参数说明: that为this, qrcode_src 本地缓存路径
function saveImgPhoto(that, qrcode_src) {
wx.showLoading({
title: '保存中',
mask: true
})
// qrcode_src 已经是本地路径,不需要downloadFile转为本地路径
wx.saveImageToPhotosAlbum({
filePath: qrcode_src,
success: function (res2) {
wx.hideLoading();
wx.showToast({
title: '保存成功',
})
},
fail: function (res3) {
wx.hideLoading();
wx.showToast({
title: '保存失败',
icon: 'none'
})
}
})
}