微信小程序使用canvas绘制分享海报

一、准备工作

最近在做的一个vue项目中,需要做一个分享海报,头秃!!!
首先确定海报那些地方是随机变动的、海报背景、引用二维码生成组件(目前市场上有很多生成二维码的组件,这个项目用的是uqrcode)注意小程序中分享二维码需要现在小程序后台开发设置中配好,不然链接进不去对应小程序中。

 //判断昵称信息是否是中文
      isChinese(size) {
        var re = /[^\u4E00-\u9FA5]/;
        let chartLength=0;
        for(let i=0;i<this.userInfo.name.length;i++){
          if (re.test(this.userInfo.name[i])) {
            chartLength=chartLength+size / 2;
          } else {
            chartLength=chartLength+size;
          }
        }
        return chartLength
      },
      //获取图片本地信息
      getImage(url, type) {
        let that = this
        return new Promise(function(resolve, reject) {
          uni.getImageInfo({
            src: url,
            success: (res) => {
              that.shareObj[type] = res.path
              resolve()
            }
          })
        })
      },
      //获取设备信息
      getSys() {
        let that = this;
        return new Promise(function(resolve, reject) {
          //获取系统信息
          wx.getSystemInfo({
            success: function(res) {
              resolve(res.windowWidth / 750)
            }
          })
        })
      },
      //生成二维码
      async qrcode() {
        await this.$refs.uqrcode.make({
          mode: 'canvas', // 默认为view
          // size: 40, //尺寸 以px为单位
          // text: '*****', //测试网址内容如:https://www.baidu.com 必须在微信公众平台上配置好,不然扫码打开的为404网页
        }).then(res => {
          // 返回的res与uni.canvasToTempFilePath返回一致
          this.shareObj.codeUrl = res.tempFilePath
        })
      },

开始生成海报

 let that = this;
        var company = 1

        wx.showLoading({
   
          title: '生成海报中...'
        })
        //获取设备信息
        company = await that.getSys()
        //获取头像等图片信息
        await that.getImage(that.userInfo.avatar, 'avatarUrl')
        //由于小程序限制2M以内,不能放置较大的背景图片在本地,并且ctx.drawImage中的url必须是本地url,所以使用线上图片需要获取图片本地信息。
        await that.getImage('https://cdn.vchen.cc/applets/guide/share-bcg.png', 'bcgUrl') 
//生成二维码,必须等待这些工作完成才能开始创建海报、不然会报错
        await that.qrcode()
        //创建canvas实例对象
        const ctx = wx.createCanvasContext('shareCanvas', that)
       //定义头像、二维码变量
        let avartarObj = {
   
            wid: 188 * company,
            hei: 188 * company,
            x: 237 * company,
            y: 177 * company,
          },
          codeObj = {
   
            wid: 114 * company,
            hei: 114 * company,
            x: 274 * company,
            y: 779 * company,
          },
          //计算昵称长度
          nameLength = (669 - that.isChinese(42) - 3 * 42) / 2
          //绘制海报背景
          ctx.drawImage(that.shareObj.bcgUrl, 0, 0, 669 * company, 975 * company);
         //绘制海报中固定的图片
          ctx.drawImage('/static/login/share-te
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值