业务场景:生成一个浮层图片
实现思路:
设置一个盒子,将canvas生成的图片和保存图片的按钮放里边,当有canvas生成图片的时候这个盒子显示,否则隐藏。
这里需要注意的是,canvas画图片的时候,如果是线上路径就先要使用wx.getImageInfo获取图片的临时路径,使用这个路径就可以在真机上显示了
前台代码:
<canvas canvas-id="myCanvas" class='canvas'/> <!-- 预览分享图 这里就是上图展示的效果 --> <!-- 刚开始是隐藏的 生成分享图之后显示, 用一个布尔变量来控制 这里的样式大家看图就写出来了 --> <view hidden='{{hidden}}' class='preview' bindtap='cancel'> <image src='{{prurl}}' mode='widthFix'></image> <view> <button type='primary' size='mini' bindtap='save'>保存分享</button> </view> </view> css代码:先让canvas不在用户的视线内 给弹出层设置固定定位,和透明色,弹性盒子 .canvas{ width: 100%; height: 100%; position: fixed; left: 0; top: 999999rpx; background-color: rgba(0,0,0,0.3) } .preview{ position:fixed; top:0; left:0; width:100vw; height:100vh; background-color:rgba(0,0,0,0.8); z-index: 2; text-align: center; display:flex; flex-flow:column; } .preview image{ width: 80%; height: 80%; margin: 10%; margin-bottom: 5%; } .preview button{ margin:0 20rpx; border-radius:50px; background-color:#ee2a65; width:40%; }
js代码:主要就是将canvas生成的图片保存为本地的路径
onShow: function () { var userId = wx.getStorageSync('user_id'); var that = this; if (userId) { var qrcode = wx.getStorageSync('qrcode'); if (!qrcode) { that.getQuear(); } } }, getQuear:function(){ var user_id = wx.getStorageSync('user_id'); wxb.Post('/api/automatic.manage/getQrcode', { user_id: user_id }, function (data) { //获取网络图片本地路径 wx.getImageInfo({ src: data.path,//服务器返回的图片地址 success: function (res) { //res.path是网络图片的本地地址 // 小程序码 wx.setStorageSync('qrcode', res.path); }, }); }); }, // 生成朋友圈图片 share: function () { var conpanyCover = this.data.companyCover; var companyName = this.data.companyName; var companyPhone = this.data.companyPhone; var companyBusiness = this.data.companyBusiness; var companyAddress = this.data.companyAddress; var companyIntroduce = this.data.companyIntroduce; var user_id = wx.getStorageSync('user_id'); var that = this; wx.getSystemInfo({ success: function (res) { console.log(res.windowHeight) console.log(res.windowWidth) that.setData({ windowHeight: res.windowHeight, windowWidth: res.windowWidth }) }, }) var windowWidth = that.data.windowWidth; const ctx = wx.createCanvasContext('myCanvas') // 设置矩形边框 ctx.setStrokeStyle('#fff') // 设置矩形宽高 ctx.strokeRect(0, 0, 400, 200) let canvas = '../../resource/canvas.png'; ctx.drawImage(canvas, 0, 0, 400, 1000) // 设置文字大小 ctx.setFontSize(12) // 设置文字颜色 ctx.fillStyle = '#9d9d9d'; var str = "长按识别二维码,查看我小程序官网"; ctx.fillText(str, (windowWidth - ctx.measureText(str).width) / 2, 510) var cover = '../../resource/4.png'; ctx.drawImage(cover, 0, 0, 400, 200); // 名字设置 var name = wx.getStorageSync('companyContacts'); // 设置文字大小 ctx.setFontSize(26) ctx.fillStyle = '#000'; var name = name; // 填充文字 ctx.fillText(name, 150, 65) // ctx.font = '微软雅黑'; // 设置文字大小 ctx.setFontSize(14) ctx.fillStyle = '#454545'; // let canpany = ' 蚂蚁未来'; let canpany = companyName; // 填充文字 ctx.fillText('公司名:' + canpany, 45, 100) // 设置文字大小 ctx.setFontSize(14) ctx.fillStyle = '#454545'; var position = ' 经理'; // 填充文字 ctx.fillText('职位:' + position, 45, 130) // 联系方式 ctx.setFontSize(14) ctx.fillStyle = '#454545'; // var tel = " 15289310354"; var tel = companyPhone; // 填充文字 ctx.fillText('联系方式:' + tel, 45, 160) // 公司地址 ctx.setFontSize(14) ctx.fillStyle = '#000'; // 填充文字 ctx.fillText('公司地址', 60, 370) // 公司业务标题 ctx.setFontSize(14) ctx.fillStyle = '#000'; // 填充文字 ctx.fillText('公司业务', 60, 230) // 公司业务 ctx.setFontSize(12) ctx.fillStyle = '#666'; var text = companyBusiness; var chr = text.split("");//这个方法是将一个字符串分割成字符串数组 var temp = ""; var row = []; for (var a = 0; a < chr.length; a++) { if (ctx.measureText(temp).width < windowWidth - 100) { temp += chr[a]; } else { a--; //这里添加了a-- 是为了防止字符丢失,效果图中有对比 row.push(temp); temp = ""; } } row.push(temp); //如果数组长度大于2 则截取前两个 if (row.length > 2) { var rowCut = row.slice(0, 2); // 这个参数就可以判断显示几行 var rowPart = rowCut[1]; var test = ""; var empty = []; for (var a = 0; a < rowPart.length; a++) { if (ctx.measureText(test).width < windowWidth) { test += rowPart[a]; } else { break; } } empty.push(test); var group = empty[0]//这里只显示两行,超出的用...表示 rowCut.splice(1, 1, group); row = rowCut; } for (var b = 0; b < row.length; b++) { ctx.fillText(row[b], 40, 253 + b * 18); } // 画线 ctx.setFillStyle('#efefef') ctx.fillRect(45, 236, windowWidth - 100, 1) // 业务图标 var yw = '../../resource/yw.png'; ctx.drawImage(yw, 40, 216, 16, 16) // 公司简介 ctx.setFontSize(14) ctx.fillStyle = '#000'; // 填充文字 ctx.fillText('公司简介', 60, 300) // 画下线 ctx.setFillStyle('#efefef') ctx.fillRect(45, 306, windowWidth - 100, 1) // 简介图标 var yw = '../../resource/jj.png'; ctx.drawImage(yw, 40, 286, 16, 16) // 公司简介 ctx.setFontSize(12) ctx.fillStyle = '#666'; // var introduction = "蚂蚁未来科技有限公司办公室地址位于中国的首都,政治、文化中心北京,北京市朝阳区西大望路15号4号楼,注册资本为50 万元"; var introduction = wx.getStorageSync('companyIntroduce'); var chr = introduction.split("");//这个方法是将一个字符串分割成字符串数组 var temp = ""; var row = []; for (var a = 0; a < chr.length; a++) { if (ctx.measureText(temp).width < windowWidth - 100) { temp += chr[a]; } else { a--; //这里添加了a-- 是为了防止字符丢失,效果图中有对比 row.push(temp); temp = ""; } } row.push(temp); //如果数组长度大于2 则截取前两个 if (row.length > 2) { var rowCut = row.slice(0, 2); var rowPart = rowCut[1]; var test = ""; var empty = []; for (var a = 0; a < rowPart.length; a++) { if (ctx.measureText(test).width < 220) { test += rowPart[a]; } else { break; } } empty.push(test); var group = empty[0]//这里只显示两行,超出的用...表示 rowCut.splice(1, 1, group); row = rowCut; } for (var b = 0; b < row.length; b++) { ctx.fillText(row[b], 40, 322 + b * 18); } // 公司地址详情 var chr = companyAddress.split("");//这个方法是将一个字符串分割成字符串数组 var temp = ""; var row = []; for (var a = 0; a < chr.length; a++) { if (ctx.measureText(temp).width < windowWidth - 100) { temp += chr[a]; } else { a--; //这里添加了a-- 是为了防止字符丢失,效果图中有对比 row.push(temp); temp = ""; } } row.push(temp); //如果数组长度大于2 则截取前两个 if (row.length > 1) { var rowCut = row.slice(0, 1); var rowPart = rowCut[0]; var test = ""; var empty = []; for (var a = 0; a < rowPart.length; a++) { if (ctx.measureText(test).width < 220) { test += rowPart[a]; } else { break; } } empty.push(test); var group = empty[0]//这里只显示两行,超出的用...表示 rowCut.splice(1, 1, group); row = rowCut; } for (var b = 0; b < row.length; b++) { ctx.fillText(row[b], 40, 390); } // 画下线 ctx.setFillStyle('#efefef') ctx.fillRect(45, 375, windowWidth - 100, 1) // 地址图标 var yw = '../../resource/dz.png'; ctx.drawImage(yw, 40, 356, 16, 16) // 小程序二维码 // var path1 = data.path; var qrcode = wx.getStorageSync('qrcode'); console.log(qrcode) ctx.drawImage(qrcode, (windowWidth - 80) / 2, 410, 80, 80) ctx.draw(false, function () { wx.canvasToTempFilePath({ canvasId: 'myCanvas', success: function (res) { console.log(res.tempFilePath) // wx.previewImage({ // urls: [res.tempFilePath] // 需要预览的图片http链接列表 // }) that.setData({ prurl: res.tempFilePath, hidden: false }) } }) }); },
点击保存图片
// 保存图片到本地 save:function(){ var that = this wx.saveImageToPhotosAlbum({ filePath: that.data.prurl, success(res) { wx.showModal({ content: '图片已保存到相册,赶紧晒一下吧~', showCancel: false, confirmText: '好的', confirmColor: '#333', success: function (res) { if (res.confirm) { console.log('用户点击确定'); /* 该隐藏的隐藏 */ that.setData({ hidden: true }) } } }) } }) },