使用canvas绘制小程序码

场景:使用小程序文档的API可以获取带参数的二维码和小程序码,但是小程序码中的图片默认都是小程序的头像(红框中的图片)。现在我们需要替换里面的图片,然后将小程序码保存成一张图片存入相册。

 

1.获取带参数的小程序码

小程序开发文档提供三种接口获取带参数的小程序码,根据自己的需求选择相应的接口。

https://developers.weixin.qq.com/miniprogram/dev/api/qrcode.html

 

2.将网络图片路径转换为本地图片路径。

  • 使用wx.getImageInfo或者wx.downloadFile可以返回图片的本地路径。
  • 用wx.setStorage将返回的本地路径存储在本地缓存中并指定key的值:path1,path2。
  • 用wx.getStorageSync(KEY)从本地缓存中同步获取指定的key对应的内容。

备注:url1为第一步获取到的带参数的小程序码。url2为需要填入小程序码中间的图片。

const url1 = "https://images/ewm.jpg";
const url2 = "https://wx.qlogo.cn/mmopen/vi_32/DYAIOgq83epNAxDh5I0dQAQrNVs4pKWrYibfbA6Xw6lOJqqYic4qTFXt9tjbTJrgpusYy4KCEXnF3iaib8sdqP6CfQ/132";
wx.getImageInfo({
     src: url1,
     success:function(res){
         wx.setStorage({
             key: 'path1',
             data: res.path,
          })
     }
})
wx.getImageInfo({
     src: url2,
     success:function(res){
         wx.setStorage({
             key: 'path2',
             data: res.path,
          })
     }
})
const path1 = wx.getStorageSync('path1');
const path2 = wx.getStorageSync('path2');

 

3.根据设备宽度设置canvas的width和height。

  • 在WXML中设置canvas组件,并在JS文件中设置data字段width,height,margin。
  • 获取设备的宽度,并保存在全局变量windowWidth中。
  • 在小程序码生成页面读取全局变量windowWidth,并根据设备的宽度设置canvas的width,height,margin。
<canvas style='width:{{width}}px;height:{{height}}px;margin:50px {{margin}}px;background-color:#ffffff;' canvas-id='ewmCanvas'></canvas>
 // 获取设备宽度
wx.getSystemInfo({
    success: function (res) {
       app.globalData.windowWidth = res.windowWidth;
    },
})
//在对应页面读取设备的宽度 
const width = app.globalData.windowWidth*4/5;
const height = app.globalData.windowWidth;
const margin = app.globalData.windowWidth / 10;
//在data中设置canvas的width和height以及左右的边距margin
this.setData({
      width:width,
      height: height,
      margin: margin
})

 

4.使用canvas绘制小程序码。

  1. 根据canvasId创建canvas绘图。
  2. 根据path1绘制原始的小程序码图片。
  3. 绘制底部文字说明。
  4. 通过ctx.save()保存当前的绘图上下文。
  5. 绘制一个圆形,使它能够完全覆盖掉原始小程序码中间的图片区域。
  6. 通过ctx.clip()方法将画布中的圆形裁剪出来。
  7. 在裁剪的圆形区域绘制一个相同大小的图片(path2),此时图片只能显示剪切后的圆形区域。
  8. ctx.restore()恢复之前保存的绘图上下文。
  9. 绘制图片和文字。ctx.stroke(),ctx.draw()。
const ctx = wx.createCanvasContext('ewmCanvas')
ctx.drawImage(path1, 0, 0, this.data.width, this.data.width);
ctx.setTextAlign('center')    
ctx.setFillStyle('#8c8c8c')  
ctx.setFontSize(15)    
ctx.fillText('扫一扫小程序码', this.data.width / 2, this.data.width + 30)
ctx.save();
ctx.strokeStyle = "#ffffff";
ctx.arc(this.data.width / 2, this.data.width / 2, this.data.width * 9 / 40, 0, 2 * Math.PI);  //绘制圆形
ctx.clip();
ctx.drawImage(path2, this.data.width * 11 / 40, this.data.width * 11 / 40, this.data.width * 9 / 20, this.data.width * 9 / 20);
ctx.stroke();
ctx.restore();
ctx.draw();

 

5.将canvas保存至相册。

  • 创建一个点击事件saveImg。
  • 调用wx.canvasToTempFilePath将canvas存储在本地,big返回一个本地路径。
  • 调用wx.saveImageToPhotoAlbum将返回的本地路径保存至相册。
  • 调用wx.showToast创建保存成功与失败时的消息提示框。

备注:当用户关闭了相册权限时就会调用失败,此时可在小程序的设置中打开权限。

saveImg:function(e){
  wx.canvasToTempFilePath({
    canvasId: 'ewmCanvas',
    success: function (res) {
      const path = res.tempFilePath;
      wx.saveImageToPhotosAlbum({
        filePath: path,
        success: function (res) {
          wx.showToast({
            title: '保存成功',
            icon:'success'
          })
        },
        fail: function (res) {
          wx.showToast({
            title: '保存失败,请在小程序中打开相册权限',
            icon: 'none'
          })
        }
     })
    }
  }, this)
}

 

转载于:https://www.cnblogs.com/kxx-21k/p/9244454.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值