虎年春节头像框制作的小程序实现

1,025 阅读4分钟

PK创意闹新春,我正在参加「春节创意投稿大赛」

1 前言

又到了一年的结尾,感觉时间过的逝贼鸡儿快,一晃一年就没了,一晃一年又没了。

记得去年由于疫情的原因没有回家过年,年三十的晚上就在家族微信群里面发那种通过玩游戏获得红包的小程序,也是很欢乐的。

虽然我自己没开发过小游戏,但是小程序还是写过一些,这不最近看到很多朋友都换上了新年头像。 就像下面这种的:

image.png

看了下主要就是两部分:图片 + 相框 叠加保存为一张图片,那我也可以去实现一个。

于是就有了这篇文章,自制虎年头像框小程序。

2 实现

话不多说,先上效果图。

b8538d928deb4ec29b4dc1c1543323b0_tplv-k3u1fbpfcp-watermark.gif

2.1 实现原理

通过效果图可以看到,在这个地方用到了两张图片:

一张是通过“获取头像”按钮获取的微信用户的头像,用作底图;

另外一张是相框图片,这是预制的静态资源;

在点击“保存头像”的时候,将上面两张图片分别通过canvas画到画板上,先画底图,在画相框图,绘制完成后将画板上的图片保存到本地就完事了。

下面开始介绍具体的实现步骤。

01c6235e4eac5fa80120a895fef3ab.jpg@3000w_1l_0o_100sh.jpg

2.2 收集静态资源

在我这个小程序中内置了一些静态资源,比如:头像框图片、首页背景图片、底部导航栏图标等。

这些图片来源于下面这几个网站,仅供参考。

阿里巴巴矢量图标库 获取图标的好去处。

千图网 获取背景图片、头像框等的好去处。

2.3 编码

分为三个部分介绍编码这个阶段。

2.3.1 获取微信用户头像

微信小程序提供有api获取微信用户信息。 wx.getUserProfile(Object object)

通过button按钮点击,获取微信用户信息:

<button bindtap="getUserProfile" class="btn1">获取头像</button>

getUserProfile实现如下:

    // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认
    getUserProfile(e) {
      let that = this;
      wx.getUserProfile({
          desc: '仅用于生成头像使用', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
          success: (res) => {
            //获取高清用户头像
            let url = res.userInfo.avatarUrl;
            while (!isNaN(parseInt(url.substring(url.length - 1, url.length)))) {
              url = url.substring(0, url.length - 1)
            }
            url = url.substring(0, url.length - 1) + "/0";
            res.userInfo.avatarUrl = url;
            that.setData({
              userInfo: res.userInfo,
              hasUserInfo: true
            })
          }
        });
    },  

到这里获取微信用户头像已经完成。

备注: 通过res.userInfo默认返回来的用户头像是低分辨率的,要获取用户头像高清图需要进行处理。

2.3.2 绘制图像

绘制图主要用到了微信小程序提供画布相关API

变量说明:

hotArr:[{name:'虎年相框',key:'hunian'},{name:'虎头帽子',key:'shendan'},{name:'国旗',key:'guoqing'}],

curHot:用于存放当前选择的hotArr的索引。

windowWidth: wx.getSystemInfoSync().windowWidth

size: 260; //自定义的大小

pc : wx.createCanvasContext('myCanvas');

drawImg(){
      wx.showLoading({
        title: '生成头像中...',
      })
      let that = this;
      let type = this.data.hotArr[this.data.curHot].key;
      let promise1 = new Promise(function(resolve, reject) {
        wx.getImageInfo({
          src: that.data.userInfo.avatarUrl,
          success: function(res) {
            resolve(res);
          }
        })
      });
      var index = that.data.defaultImg;
      let promise2 = new Promise(function(resolve, reject) {
        wx.getImageInfo({
          src: `../../images/${type}/hat${index}.png`,
          success: function(res) {
            resolve(res);
          }
        })
      });
      Promise.all([
        promise1, promise2
      ]).then(res => {
        //主要就是计算好各个图文的位置
        pc.clearRect(0, 0, windowWidth, size);
        //绘制背景图
        pc.drawImage(res[0].path, windowWidth/2-130, 0, size, size)
        //绘制相框图
        pc.drawImage('../../' + res[1].path, windowWidth/2-130, 0, size, size)
        pc.stroke()
        pc.draw(false, () => {
            //图片绘制成功回调,调用保存canvas方法
            this.canvasToTempFile();
        })
      })
    },

wx.getImageInfo() 主要用于获取图片的信息,返回图片的本地路径;

这个地方主要是因为drawImage() 只支持绘制本地图片。

2.3.3 保存图像

在上一步我们已经将两张图片绘制到画布上面了,下面将画布上的内容保存到本地。

保存画布上的内容到本地相册也分为两步。

第一步:把当前画布指定区域的内容导出生成指定大小的图片。

通过使用 wx.canvasToTempFilePath()

第二步:将保存图片本地相册。

通过使用 wx.saveImageToPhotosAlbum(developers.weixin.qq.com/miniprogram…)

 canvasToTempFile(){
    wx.canvasToTempFilePath({
      x: windowWidth/2-130,  //这个地方减去130是因为我们的图片尺寸设置的是260
      y: 0,
      height: size,
      width: size,
      canvasId: 'myCanvas',
      success: (res) => {
        wx.saveImageToPhotosAlbum({
          filePath: res.tempFilePath,
          success: result => {
            wx.hideLoading();
            wx.showModal({
              content: '图片已保存到相册,请前往微信去设置哟!',
              showCancel: false,
              success: function(res) {
                if (res.confirm) {
                  console.log('用户点击确定');
                }
              }
            })
          }, fail(e) {
            wx.hideLoading();
            console.log("err:" + e);
          }
        })
      }
    });
  },

到这里也就实现了基本的头像框功能。

3 最后

感兴趣的小伙伴可以扫码体验:

gh_2f4aab28313b_258.jpg

当然了,基于上面的内容你也可以制作自己的头像小程序。 github地址: github.com/YMAndroid/p…

最后 提前恭祝大家春节快乐,虎年大吉!!!

d2f4a4515d3536cbe7b9011cd37b5a24.gif