微信小程序 海报合成 canvas


wxml

<canvas canvas-id="shareFrends" class="canvas"></canvas>

wxss

.canvas {
  width: 660rpx;
  height: 960rpx;
  width:364px;
  height:529px;
  position: fixed;
  top: -450%;
  left: 50%;
  z-index: -1;
  transform: translate(-50%,-53%);
  background-color: #FFFFFF;
  border-radius: 10rpx;
  /* 这里注意canvas容器不能写隐藏 否则真机调试会出现无法渲染的情况。 */
  /* //display: none; */
}

wxjs

 
Page({
      flexTeacherClick: function (e) {
        this.setData({
          hideflexalert: !this.data.hideflexalert
        });
      },
      flexTeacherClickCanvas: function (e) {
        this.setData({
          hideflexalertcanvas:true
        });
        this.saveImg();
      },
      copyBtn: function (e) {
        var that = this;
        wx.setClipboardData({
          //准备复制的数据
          data: that.data.wechatnum,
          success: function (res) {
            wx.showToast({
              title: '复制成功',
            });
          }
        });
      },
      shareFriends: function () {
        var that = this;
        wx.showLoading({
          title: '图片生成中',
        });
        that.creatImg();
        setTimeout(function () {
          wx.canvasToTempFilePath({
            canvasId: 'shareFrends',
            success: function (res) {
              var tempFilePath = res.tempFilePath;
              that.setData({
                imagePath: tempFilePath,
                hideflexalertcanvas: false
              });
              wx.hideLoading();
            },
            fail: function (res) {
              console.log(res);
            }
          });
        }, 200);
      },
      creatImg: function () {
        var that = this;
        var detail = this.data.hbdetail;
        var ctx = wx.createCanvasContext('shareFrends');
        ctx.setFillStyle('#FFFFFF');
        ctx.fillRect(0, 0, 660, 960);
        //ctx.draw();
        var date = new Date();
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var day = date.getDate();
        var time = year + '-' + month + '-' + day;   // 绘图的时间
        var name = detail.hbtitle;     //绘图的标题  需要处理换行
        var pichName = detail.hbname;  //用户昵称
        var title = detail.hbtitle;  //标题
        var desc = detail.hbdesc;  //描述
        var price = detail.hbprice;  //价格
        if (pichName.length > 16) {   //用户昵称显示一行 截取
          pichName = pichName.slice(0, 9) + '...';
        }
        // ctx.setFillStyle("#000000");
        // ctx.setStrokeStyle("#00ff00");
        // ctx.save();
        //绘制头部背景
        ctx.setFillStyle('#eeeeee');
        ctx.fillRect(0, 0, 660, 60);
        ctx.save();
    
        ctx.beginPath(); //开始绘制
        //绘制头像
        ctx.arc(35 / 2 + 15, 35 / 2 + 14, 35 / 2, 0, Math.PI * 2, false);
        ctx.clip();
        ctx.drawImage(detail.hbimg, 15, 14, 35, 35);
        ctx.restore(); //恢复之前保存的绘图上下文 恢复之前保存的绘图上下午即状态 还可以继续绘制
        //绘制名字
        ctx.setFontSize(14);
        var pichNameW = ctx.measureText(pichName).width;//测量并返回文本宽度
        ctx.setFillStyle('#323232');
        ctx.fillText(pichName, 60, 28, pichNameW + 10);
        // ctx.draw();
        //绘制时间
        ctx.setFontSize(12);
        time = time + ' 发布了一个拼团';
        var metrics = ctx.measureText(time).width;//测量并返回文本宽度
        ctx.setFillStyle('#969696');
        ctx.fillText(time, 60, 45, metrics + 10);
        //绘制标题
        ctx.setFontSize(17);
        var titleW = ctx.measureText(title).width;//测量并返回文本宽度
        ctx.setFillStyle('#323232');
        ctx.fillText(title, 15, 96, titleW + 10);
        //绘制描述
        ctx.setFontSize(13);
        var descW = ctx.measureText(desc).width;//测量并返回文本宽度
        ctx.setFillStyle('#646464');
        that.wordsWrap(ctx, desc, descW, 320, 15, 120, 24);
        // ctx.fillText(desc, 15, 120, descW + 10);
    
        // 绘制宣传图
        ctx.drawImage(detail.hbimg, 15, 190, 334, 210);
    
        //绘制价格
        ctx.setFontSize(20);
        var priceW = ctx.measureText(price).width;//测量并返回文本宽度
        ctx.setFillStyle('#FF4642');
        ctx.fillText(price, 15, 474, priceW + 10);
        //绘制宣传文本
        var xctext1 = '一群人赶来拼团';
        ctx.setFontSize(12);
        var xctextW1 = ctx.measureText(xctext1).width;//测量并返回文本宽度
        ctx.setFillStyle('#969696');
        //that.wordsWrap(ctx, xctext, xctextW, 84, 170, 464,16);
        ctx.fillText(xctext1, 170, 460, xctextW1 + 10);
    
        var xctext2 = '扫码参与';
        ctx.setFontSize(12);
        var xctextW2 = ctx.measureText(xctext2).width;//测量并返回文本宽度
        ctx.setFillStyle('#969696');
        //that.wordsWrap(ctx, xctext, xctextW, 84, 170, 464,16);
        ctx.fillText(xctext2, 205, 478, xctextW2 + 10);
        //绘制二维码
        ctx.drawImage(detail.hbimg, 264, 422, 84, 84);
        ctx.draw();
      },
      // canvas 标题超出换行处理
      wordsWrap: function (ctx, name, nameWidth, maxWidth, startX, srartY, wordsHight) {
        var lineWidth = 0;
        var lastSubStrIndex = 0;
        for (var i = 0; i < name.length; i++) {
          lineWidth += ctx.measureText(name[i]).width;
          if (lineWidth > maxWidth) {
            ctx.fillText(name.substring(lastSubStrIndex, i), startX, srartY);
            srartY += wordsHight;
            lineWidth = 0;
            lastSubStrIndex = i;
          }
          if (i == name.length - 1) {
            ctx.fillText(name.substring(lastSubStrIndex, i + 1), startX, srartY);
          }
        }
      },
      saveImg:function() {
        var that = this;
        // 获取用户是否开启用户授权相册
        wx.getSetting({
          success(res) {
            // 如果没有则获取授权
            if (!res.authSetting['scope.writePhotosAlbum']) {
              wx.authorize({
                scope: 'scope.writePhotosAlbum',
                success() {
                  wx.saveImageToPhotosAlbum({
                    filePath: that.data.imagePath,
                    success() {
                      wx.showToast({
                        title: '保存成功'
                      });
                    },
                    fail() {
                      wx.showToast({
                        title: '保存失败',
                        icon: 'none'
                      });
                    }
                  });
                },
                fail() {
                // 如果用户拒绝过或没有授权,则再次打开授权窗口
                //(ps:微信api又改了现在只能通过button才能打开授权设置,以前通过openSet就可打开,下面有打开授权的button弹窗代码)
                  that.setData({
                    openSet: true
                  });
                }
              });
            } else {
              // 有则直接保存
              wx.saveImageToPhotosAlbum({
                filePath: that.data.imagePath,
                success() {
                  wx.showToast({
                    title: '保存成功'
                  });
                },
                fail() {
                  wx.showToast({
                    title: '保存失败',
                    icon: 'none'
                  });
                }
              });
            }
          }
        });
      },
    });

参考文档:
https://www.cnblogs.com/zzgyq/p/8882995.html
https://www.jianshu.com/p/5f96a4f91b9c
https://www.jianshu.com/p/8695f78c27ff

声明:麋鹿与鲸鱼|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 微信小程序 海报合成 canvas


Carpe Diem and Do what I like