微信小程序canvas分享朋友圈海报

思路:生成朋友圈海报放在公共文件,首先需要绘制canvas,点击分享朋友圈按钮,在手机屏幕看不见的地方(定位left:1000px)绘制出canvas,绘制完成将canvas转为图片显示。点击保存按钮,将本地缓存路径的图片下载到手机相册,在这里需要进行授权处理

untils.js文件

// 参数说明: mainImg 商品图 headImg 微信头像 onshareImg  二维码 goodsName 商品名称 goodsDec 商品描述 goodsTime 截图时间 goodsPrice 商品价格 callback 绘制完成回调

// 需要在小程序控制台downfile加入网络图片的域名, 否则无法显示图片

shareImgCanvas: function(mainImg, headImg, onshareImg, goodsName, goodsDec, goodsTime, goodsPrice, callback) {
    var that = this
    // 防止网络图片绘制失败, 将网络图片更改为本地缓存图片, 成功回调执行 
    let promise1 = new Promise(function(resolve, reject) {
      wx.getImageInfo({
       // src需要使用https网络路径
        src: mainImg,
        success: function(res) {
          resolve(res);
        }
      })
    });
    let promise2 = new Promise(function(resolve, reject) {
      wx.getImageInfo({
        src: headImg,
        success: function(res) {
          resolve(res);
        }
      })
    });
    let promise3 = new Promise(function(resolve, reject) {
      wx.getImageInfo({
        src: onshareImg,
        success: function(res) {
          resolve(res);
        }
      })
    });
    // all接收数组作为参数, p1 p2 p3 三个返回值, 都为fulfilled执行
    Promise.all([
      promise1, promise2, promise3
    ]).then(res => {
      // 创建上下文
      var ctx = wx.createCanvasContext('shareImg')
      // 开始绘制
      ctx.beginPath();
      // 列表商品都有分享朋友圈功能, 需要多次调用绘制, 每次需先清除画布重新绘制
      // 清除矩形区域
      ctx.clearRect(0, 0, 400, 667)
      // 重新填充, 不填充无法清除画布
      // ctx.fillRect(0, 0, 400, 667); (无法清除画布看情况添加)
      // 开始画
      ctx.beginPath();
      // 填充白色
      ctx.setFillStyle("#fff")
      // 填充进矩形框
      ctx.fillRect(0, 0, 400, 667);
      // 商品图
      ctx.drawImage(res[0].path, 0, 0, 400, 400)
      // 二维码
      ctx.drawImage(res[2].path, 290, 470, 100, 100)
      // 画头像圆
      ctx.arc(364, 110, 30, 0, Math.PI * 2, false);
      // 切割圆, 调用fillRect后,模拟器显示切割不成功, 
      ctx.clip();
      // 头像
      ctx.drawImage(res[1].path, 335, 80, 60, 60)
      // 恢复之前保存的上下文(清除画布后,文字不显示)
      ctx.restore();
      // 文字位置
      ctx.setTextAlign('left')
      // 文字颜色
      ctx.setFillStyle('#666')
      // 文字大小
      ctx.setFontSize(20)
      // 填充文字
      ctx.fillText(goodsname, 20, 430)
      ctx.setTextAlign('left')
      ctx.setFillStyle('#aaa')
      ctx.setFontSize(18)
      ctx.fillText(goodsTime, 20, 470)
      ctx.setTextAlign('left')
      ctx.setFillStyle('#f07f45')
      ctx.setFontSize(24)
      ctx.fillText('¥ ' + goodsPrice, 20, 530)
      // 绘制路径的边框(头像黑框)
      ctx.stroke()
      // 绘制到画布中,绘制成功掉生成海报图
      ctx.draw(false, function() {
        callback()
      })
    })
  },

untils.js文件
生成朋友圈图

getFriendImg: function(that) {
    // canvas转图片
    wx.canvasToTempFilePath({
      x: 0,
      y: 0,
      width: 400,
      height: 600,
      destWidth: 400,
      destHeight: 600,
      canvasId: 'shareImg',
      success: function(res) {
        // 本地临时路径
        that.setData({
          qrcode_src: res.tempFilePath,
        })
      },
      fail: function(res) {
        wx.showToast({
          title: '加载失败,稍后再试~',
          icon: "none"
        })
      }
    })
  }

保存图片前授权

//  参数说明 that 为调用处的this, callback为回调全局保存is_friendAuthor  ,is_friendAuthor 是否已经授权相册, qrcode_src本地缓存路径, returncallback 失败回调

function saveImage(that, callback, is_friendAuthor, qrcode_src, returncallback) {
   // 未授权
  if (is_friendAuthor) {
    wx.showModal({
      title: '授权提示',
      content: '"千真优农"要访问你的本地相册,是否允许?',
      success: function(res) {
        if (res.confirm) {
          wx.openSetting({
            success: function(res) {
                // 允许授权
              if (res.authSetting["scope.writePhotosAlbum"]) {
              	 // 将允许授权全局保存
                callback(false)
                // 保存图片
                common.saveImgPhoto(that, qrcode_src, callback, returncallback)
              } else {
                callback(true)
                wx.showToast({
                  title: '保存失败',
                  icon: 'none'
                });
                returncallback()
              }
            }
          })
        } else if (res.cancel) {
          callback(true)
          wx.showToast({
            title: '保存失败',
            icon: 'none'
          });
        }
      }
    })
  } else {
   // 已经授权, 直接保存图片
    common.saveImgPhoto(that, qrcode_src, callback, returncallback)
  }
}

common文件
保存图片

// 参数说明: that为this, qrcode_src 本地缓存路径
function saveImgPhoto(that, qrcode_src) {
  wx.showLoading({
    title: '保存中',
    mask: true
  })
  // qrcode_src 已经是本地路径,不需要downloadFile转为本地路径
  wx.saveImageToPhotosAlbum({
    filePath: qrcode_src,
    success: function (res2) {
      wx.hideLoading();
      wx.showToast({
        title: '保存成功',
      })
    },
    fail: function (res3) {
      wx.hideLoading();
      wx.showToast({
        title: '保存失败',
        icon: 'none'
      })
    }
  })
}

效果图(缺少商品描述)
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值