赞
踩
wxml
<canvas type="2d" id="canvas" style="width: {{canvasW}}px; height: {{canvasH}}px;"></canvas>
<view class="save-btn flex-colum flex-lr-center flex-tb-center" catchtap="saveImg">
<image src="/images/save-img.png"></image>
<text class="font-color-2b margin-t-10">保存到相册</text>
</view>
js
data: { username: '', //学员姓名 receipt: '', //收据单号 qrCode: '', canvas:'',//画布对象 canvasW: 0, //画布宽 canvasH: 0, //画布高 }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { console.log(options); let that = this; const dpr = wx.getSystemInfoSync().pixelRatio; //设备像素比 // 获取设备宽度,计算canvas宽高 wx.getSystemInfo({ success: function (res) { console.log('设备宽度', res); let canvasW = Math.round(res.screenWidth*dpr * 0.4);//乘以设备像素比,使canvas适应各种屏幕不至于大小不同 let canvasH = canvasW; that.setData({ canvasW, canvasH, canvasX: res.screenWidth }) that.createCavas(); // 暂时在此执行 } }) }, /** * 创建图片实例 */ createCavas() { wx.createSelectorQuery() .select('#canvas') .fields({ node: true, size: true, }) .exec(this.init.bind(this)) }, init(res) { const width = res[0].width const height = res[0].height const canvas = res[0].node; //获取画布节点 this.setData({canvas:canvas}); const ctx = canvas.getContext('2d'); //获取画布上下文 let canvasW = width; let canvasH = height; canvas.width = canvasW; // 设置画布宽 canvas.height = canvasH; ctx.fillStyle = '#fff'; //设置背景色(填充色) // ctx.fillRect(0, 0, width, height); //填充一个矩形 //绘制圆角矩形 this.darwRoundRect(0,0,this.data.canvasW,this.data.canvasH,this.data.canvasW/2-135,ctx); // 创建一个图片对象 let poster = canvas.createImage(); poster.src = this.data.qrCode; let codeW = canvasW / 1.5; //二维码宽 let codeH = canvasH / 1.5; //二维码高 let codX = this.data.canvasW / 2 - codeW / 2; let codY = this.data.canvasH / 2 - codeH / 2; poster.onload = () => { ctx.drawImage(poster, codX, codY, codeW, codeH); //生成图片 } //添加文字 ctx.fillStyle = "#333333"; ctx.font = "14px Arial"; console.log(ctx.measureText(this.data.username).width); //获取文本宽 ctx.fillText('长按识别二维码,进入查看缴费详情', (canvasW - ctx.measureText('长按识别二维码,进入查看缴费详情').width) / 2, codY + codeH + 15); ctx.fillText(this.data.receipt, (canvasW - ctx.measureText(this.data.receipt).width) / 2, codY); ctx.fillText(this.data.username, (canvasW - ctx.measureText(this.data.username).width) / 2, codY - 20); }, /** * 绘制圆角矩形 * @param {*} x 起始点x坐标 * @param {*} y 起始点y坐标 * @param {*} w 矩形宽 * @param {*} h 矩形高 * @param {*} r 圆角半径 * @param {*} ctx 画板上下文 */ darwRoundRect(x, y, w, h, r, ctx) { // 左上弧线 ctx.arc(x + r, y + r, r, 1 * Math.PI, 1.5 * Math.PI) // 左直线 ctx.moveTo(x, y + r) ctx.lineTo(x, y + h - r) // 左下弧线 ctx.arc(x + r, y + h - r, r, 0.5 * Math.PI, 1 * Math.PI) // 下直线 ctx.lineTo(x + r, y + h) ctx.lineTo(x + w - r, y + h) // 右下弧线 ctx.arc(x + w - r, y + h - r, r, 0 * Math.PI, 0.5 * Math.PI) // 右直线 ctx.lineTo(x + w, y + h - r) ctx.lineTo(x + w, y + r) // 右上弧线 ctx.arc(x + w - r, y + r, r, 1.5 * Math.PI, 2 * Math.PI) // 上直线 ctx.lineTo(x + w - r, y) ctx.lineTo(x + r, y) ctx.fillStyle='white'; ctx.fill();//对当前路径中的内容进行填充。默认的填充色为黑色 }, /** * 保存图片 */ saveImg() { wx.canvasToTempFilePath({ canvas: this.data.canvas, x: 0, y: 0, width: this.data.canvasW*2, height: this.data.canvasH*2, destWidth: this.data.canvasW, destHeight: this.data.canvasH, // fileType:'jpg', success: res => { wx.saveImageToPhotosAlbum({ filePath: res.tempFilePath, success(res) { wx.showToast({ title: '已保存到相册', icon: 'success', duration: 3000 }) } }) } }) },
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。