小程序实现Canvas生成海报下载功能

内容包含获取用户头像昵称,绘制分享海报下载+预览功能

效果如图:
zzppff

话不多说,先上代码

  1. wxml
<view bindtap='saveImage' class="button">
  生成图片
</view>
<canvas canvas-id='share' style='width:1000px;height:1200px;positon:fixed;top:120vh;left:0;' hidden='{{canvasHidden}}'></canvas> 

canvas标签大小要大于等于生成的图片尺寸,并隐藏

  1. js
 data: {
    canvasHidden: true,  //设置画板的显示与隐藏,画板不隐藏会影响页面正常显示
  },
 //canvas生成方法
  saveImage: function () {
    wx.showLoading({
      title: '正在生成图片...',
    })
    const that = this;
    //设置画板显示,才能开始绘图
    that.setData({
      canvasHidden: false
    })
    const context = wx.createCanvasContext('share')
    //用户头像昵称
    console.log(that.data.avatarUrl, that.data.nickName)
    let userPath = that.data.avatarUrl
    let userName = that.data.nickName.slice(0, 16)
    //二维码路径
    let cardPath = "../../images/card.png"
    let bgPath = "../../images/bg.png"
    //开始绘制
    context.drawImage(bgPath, 0, 0, 1000, 1200)//白色背景
    context.drawImage(cardPath, 320, 490, 360, 360)  //二维码
    context.lineWidth = 10; //直线宽度
    context.strokeStyle = "#111"; //直线颜色
    context.moveTo(0, 60);
    context.lineTo(360, 60); //直线长度
    context.moveTo(0, 96);
    context.lineTo(300, 96);
    context.stroke(); //绘制
    context.textAlign = "center" //文字对齐方式
    context.setFontSize(72) //文字大小
    context.setFillStyle("#111") //文字颜色
    context.fillText(userName, 500, 312) //绘制用户名
    context.setFontSize(48)
    context.fillText('给你推荐了一个小程序', 500, 400) //绘制文字
    context.setFillStyle("#666")
    context.setFontSize(36)
    context.fillText('长按识别小程序', 500, 930)
    context.setFontSize(32)
    context.fillText('ZZPPFF', 500, 1100)
    //绘制圆形图案开始
    context.save(); // 先保存状态
    context.beginPath();
    context.arc(500, 670, 80, 0, Math.PI * 2, false);
    //先画圆 前两个参数确定圆心x/y坐标  第三个参数是圆的半径
    context.clip();
    context.drawImage(userPath, 420, 590, 160, 160); 
    //绘制图片,前两个参数为arc中x/y-半径,后两个参数为半径*2
    context.restore(); //恢复之前保存的绘图 继续绘制
    //绘制圆形图案结束
    //把画板内容绘制成图片,并回调 画板图片路径
    context.draw(false, function () {
      wx.hideLoading()
      wx.showLoading({
        title: '保存中...',
      })
      wx.canvasToTempFilePath({
        x: 0,
        y: 0,
        width: 1000,
        height: 1200,
        destWidth: 1000,
        destHeight: 1200,
        canvasId: 'share',
        success: function (res) {
          that.setData({
            shareImgPath: res.tempFilePath
          })
          if (!res.tempFilePath) {
            wx.hideLoading()
            wx.showModal({
              title: '提示',
              content: '图片绘制中,请稍后重试',
              showCancel: false
            })
          }
          //绘制成功后将图片保存到用户相册
          wx.saveImageToPhotosAlbum({
            filePath: res.tempFilePath,
            //保存成功失败之后,都要隐藏画板,否则影响界面显示。
            success: (res) => {
              //console.log(res)
              wx.hideLoading()
              wx.showModal({
                title: '已成功保存至本地相册!',
                content: '',
                showCancel: false,
                success: function (res) {
                  that.setData({
                    canvasHidden: true
                  })
                  //进入预览
                  wx.previewImage({
                    current: 'that.data.shareImgPath',
                    urls: [that.data.shareImgPath]
                  })
                }
              })
            },
            fail: (err) => {
              console.log(err)
              wx.hideLoading()
              wx.showModal({
                title: '失败请重试!',
                content: '',
                showCancel: false,
                success: function (res) {
                  that.setData({
                    canvasHidden: true
                  })
                }
              })
            }
          })
        }
      })
    });
  }

绘制圆形头像需要用到本方法中圆形绘制方法
本示例实现了用户头像覆盖小程序头像来分享的效果

3、用户信息获取方法

//在之前页面已得到用户授权的
onShow: function () {
    const that = this
    wx.getUserInfo({
      success: function (res) {
        var nickName = res.userInfo.nickName
        wx.downloadFile({
          url: res.userInfo.avatarUrl,
          success(res) {
            that.setData({
              avatarUrl: res.tempFilePath,
              nickName: nickName,
            })
          },
          fail() {
            that.setData({
              avatarUrl: '../../images/user1.png',
              nickName: '你的小伙伴'
            }, () => {
              console.log("未获取到用户数据,使用默认名称")
            })
          }
        })
      }
    })
  }

  //在之前页面未得到用户授权的需要添加以下方法
  onLoad: function () {
    //获取用户信息,头像,昵称
    if (app.globalData.userInfo) {
      this.setData({
        userInfo: app.globalData.userInfo,
        hasUserInfo: true
      })
    } else if (this.data.canIUse) {
      // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
      // 所以此处加入 callback 以防止这种情况
      app.userInfoReadyCallback = res => {
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    } else {
      // 在没有 open-type=getUserInfo 版本的兼容处理
      wx.getUserInfo({
        success: res => {
          app.globalData.userInfo = res.userInfo
          this.setData({
            userInfo: res.userInfo,
            hasUserInfo: true
          })
        }
      })
    }
  },
  //获取用户信息,头像,昵称
  getUserInfo: function (e) {
    console.log(e)
    app.globalData.userInfo = e.detail.userInfo
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  }

原理:通过Canvas定位进行图像及文字的绘制,绘制完成后得到图片的临时路径,自己决定下载与预览的调用即可

图片资源见Github



作者:zzppff
Github链接:https://github.com/zzppff/zzppff-miniprogram
原创方法,商业转载请联系作者获得授权,非商业转载请注明出处。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值