小程序canvas绘制海报

360 阅读2分钟
1、如果要处理多张海报绘制需要使用Promise先把海报加载到本地然后进行绘制
// 网络图片回调
 downfile(url) {
   //下载网络图片的promise对象
   return new Promise(function(resolve, reject) {
     wx.downloadFile({
       url: url,
       success: function(res) {
         resolve(res.tempFilePath);
       }
     });
   });
 }
 2、点击进行绘制
  // 生成二维码
   generateQr() {
     wx.showLoading({
       title: '绘制中...'
     });
     let a = this.all_arr;
     let hb = a.img_url;//第一张海报路劲
     let tx = wx.getStorageSync('wxUserInfo');//头像取本地缓存
     let photo = tx.head_icon;//微信头像
     let qr = this.qr;//二维码路劲
     let name = tx.nick_name;//微信昵称
     console.log(727, hb, photo, qr);
     let promise1 = this.downfile(hb);//调用Promise加载在本地
     let promise2 = this.downfile(photo);//调用Promise加载在本地
     let promise3 = this.downfile(qr);//调用Promise加载在本地
     console.log(1111, promise1, promise2, promise3);
     Promise.all([promise1, promise2, promise3])
       .then(res => {
         //  console.log(557,res)   //就是所有的网络图片都下载到本地后在绘制图像。
         let ctx = wx.createCanvasContext('prodImage');
         ctx.setFillStyle('#fff');
         ctx.fillRect(0, 0, 270, 480); //填充色
         ctx.drawImage(res[0], 0, 0, 270, 350);
         // 绘制圆形头像
         ctx.save(); //保存当前的绘图上下文。
         ctx.beginPath(); //开始创建一个路径
         ctx.arc(28 / 2 + 25, 28 / 2 + 380, 14, 0, 2 * Math.PI, false); //画一个圆形裁剪区域
         ctx.clip(); //裁剪
         ctx.drawImage(res[1], 25, 380, 28, 28); //绘制图片
         ctx.restore(); //恢复之前保存的绘图上下文
         // 绘制头像
         ctx.drawImage(res[2], 181, 360, 64, 64);
         //绘制二维码
         //绘制文字超过2行换行显示
         var text = name;
         var chr = text.split('');
         var temp = '';
         var row = [];
         ctx.setFillStyle('#444'); //文字颜色:默认黑色
         ctx.font = 'normal bold 12px  PingFangSC-Semibold';
         for (let a = 0; a < chr.length; a++) {
           if (ctx.measureText(temp).width < 100) {
             temp += chr[a];
           } else {
             a--;
             row.push(temp);
             temp = '';
           }
         }
         row.push(temp);
         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 < 100) {
               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], 60, 390 + b * 15);
         }
         //绘制文字结束
         ctx.setFillStyle('#666'); //文字颜色:默认黑色
         ctx.font = 'normal 10px PingFang-SC-Regular';
         if (row.length > 1) {
           ctx.fillText('长按识别 即刻选购', 60, 425); //绘制文本
         } else {
           ctx.fillText('长按识别 即刻选购', 60, 410); //绘制文本
         }

         ctx.beginPath();
         ctx.lineWidth = 1;
         ctx.strokeStyle = '#f4f4f4';
         ctx.moveTo(0, 435);
         ctx.lineTo(270, 435);
         ctx.stroke();
         ctx.setFillStyle('#999'); //文字颜色:默认黑色
         ctx.font = 'normal 14px  PingFangSC-Regular';
         ctx.fillText('保存分享海报', 100, 462); //绘制文本
         ctx.drawImage('./image/down.png', 74, 447, 20, 20); //绘制图片
         //调用draw()开始绘制
         ctx.draw();
         wx.hideLoading();
         return res;
       })
       .then(res => {
         // console.log(592,res);
       });
   },