小程序海报制作
刚开始思路是通过php后台,用cavans把海报的所有内容画在一张图片上,保存在服务器中,小程序获取图片地址,在前端展示,过程也很顺利的完成,也展示成功,但图片效果太差,很模呼,查询百度也不知道怎么处理这个模呼问题,所以最后只能放弃,还是选择了直接在小程序端用cavans直接制作图片展示,显示图片清晰度也比较满意。
参考网络上的代码,用弹窗显示海报,效果图和代码如下
wxml中定义一个隐藏的弹窗,点击生成海报,触发显示
<view class='imagePathBox' hidden="{{maskHidden == false}}">
<image src="{{imagePath}}" class='shengcheng'></image>
<text class='baocun' bindtap='baocun'>保存相册,分享到朋友圈</text>
</view>
<view hidden="{{maskHidden == false}}" class="mask"></view>
<view class="canvas-box">
<canvas style="width: 375px;height: 667px;position:fixed;top:9999px" canvas-id="mycanvas" />
</view>
wxss
/* 海报 */
.imagePathBox{
width: 100%;
height: 100%;
background: rgba(0,0,0,0.7);
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 10;
}
.shengcheng{
width: 80%;
height: 80%;
position: fixed;
top: 50rpx;
left: 50%;
margin-left: -40%;
z-index: 10;
}
.baocun{
display: block;
width: 80%;
height: 80rpx;
padding: 0;
line-height: 80rpx;
text-align: center;
position: fixed;
bottom: 150rpx;
left: 10%;
background: #2e3878;
color: #fff;
font-size: 1rem;
border-radius: 44rpx;
}
button[class="baocun"]::after{
border: 0;
}
js(php后端怎么获取二维码和相关操作,在这就不展示了)
//获取应用实例
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
userInfo: [],
ewmImg:'',
bdEwmImg:'',
bdUserImg:'',
maskHidden: false,
},
//获取用户二维码
getUserEwm: function () {
var that = this
console.log('获取用户二维码');
wx.request({
url: app.globalData.url + '/admin.php/index/getUserEwm',
data: {
weichat_openid: app.globalData.userInfo.openid
},
header: {
'content-type': 'application/json' // 默认值
},
success: function (res) {
console.log(res.data);
that.setData({
ewmImg: res.data,
})
// canvas绘制网络图片需保存至本地
wx.getImageInfo({
src: res.data,//服务器返回的图片地址
success: function (res1) {
//res.path是网络图片的本地地址
console.log('本地二维码')
console.log(res1)
that.setData({
bdEwmImg: res1.path,
})
},
fail: function (res1) { }
});
}
})
},
roundRectColor:function(context, x, y, w, h, r) { //绘制圆角矩形(纯色填充)
context.save();
context.setFillStyle("#C7CADB");
context.setStrokeStyle('#C7CADB')
context.setLineJoin('round'); //交点设置成圆角
context.setLineWidth(r);
context.strokeRect(x + r / 2, y + r / 2, w - r, h - r);
context.fillRect(x + r, y + r, w - r * 2, h - r * 2);
context.stroke();
context.closePath();
},
//将canvas转换为图片保存到本地,然后将图片路径传给image图片的src
createNewImg: function () {
var that = this;
var context = wx.createCanvasContext('mycanvas');
this.roundRectColor(context, 0, 100, 375, 500, 16);
context.drawImage(that.data.bdEwmImg, 50, 280, 275, 275);
var avatarurl_width = 120; //绘制的头像宽度
var avatarurl_heigth = 120; //绘制的头像高度
var avatarurl_x = 135; //绘制的头像在画布上的位置
var avatarurl_y = 25; //绘制的头像在画布上的位置
context.save();
context.beginPath(); //开始绘制
//先画个圆 前两个参数确定了圆心 (x,y) 坐标 第三个参数是圆的半径 四参数是绘图方向 默认是false,即顺时针
context.arc(avatarurl_width / 2 + avatarurl_x, avatarurl_heigth / 2 + avatarurl_y, avatarurl_width / 2, 0, Math.PI * 2, false);
context.clip();//画好了圆 剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内 这也是我们要save上下文的原因
context.drawImage(that.data.bdUserImg, avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth); // 推进去图片,必须是https图片
context.restore(); //恢复之前保存的绘图上下文 恢复之前保存的绘图上下午即状态 还可以继续绘制
// context.drawImage(that.data.bdUserImg, 112, 10, 150, 150);
context.setFillStyle('#2e3878')
context.setFontSize(35)
context.fillText('天龙', 150, 220)
context.draw();
//将生成好的图片保存到本地,需要延迟一会,绘制期间耗时
setTimeout(function () {
wx.canvasToTempFilePath({
canvasId: 'mycanvas',
success: function (res) {
var tempFilePath = res.tempFilePath;
that.setData({
imagePath: tempFilePath,
canvasHidden: true
});
},
fail: function (res) {
console.log(res);
}
});
}, 200);
},
//点击保存到相册
baocun: function () {
console.log('点击保存到相册')
var that = this
wx.saveImageToPhotosAlbum({
filePath: that.data.imagePath,
success(res) {
wx.showModal({
content: '图片已保存到相册,赶紧晒一下吧~',
showCancel: false,
confirmText: '好的',
confirmColor: '#333',
success: function (res) {
if (res.confirm) {
console.log('用户点击确定');
/* 该隐藏的隐藏 */
that.setData({
maskHidden: false
})
}
}, fail: function (res) {
console.log(11111)
}
})
}
})
},
//点击生成海报
createPoster: function (e) {
var that = this;
this.setData({
maskHidden: false
});
wx.showToast({
title: '生成海报中...',
icon: 'loading',
duration: 1000
});
setTimeout(function () {
wx.hideToast()
that.createNewImg();
that.setData({
maskHidden: true
});
}, 1000)
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
userInfo: app.globalData.userInfo
})
var that = this
wx.downloadFile({
url: that.data.userInfo.weichat_img,
success(downloadRes) {
console.log(downloadRes)
if (downloadRes.statusCode === 200) {
that.setData({
bdUserImg: downloadRes.tempFilePath
})
}
}
})
this.getUserEwm();
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function (ops) {
console.log('分享')
console.log(ops.from)
// if (ops.from === 'button') {
// console.log("来自页面内转发按钮");
// console.log(ops.target);
// var title = ops.target.dataset.title;
// if (title.length > 16) {
// title = title.substring(0, 16) + '...';
// }
// var img = ops.target.dataset.img;
// var id = ops.target.dataset.id;
// } else {
// console.log("来自右上角转发菜单")
// }
return {
title: '创点智卫好友分享',
path: '/pages/index/index?aOpenid=' + app.globalData.userInfo.openid,
// imageUrl: img,
success: function (res) {
// console.log("转发成功", res);
wx.navigateBack({
delta: 1
})
},
fail: function (res) {
console.log("转发失败", res);
}
}
}
})