头像加相框微信小程序

微信小程序—头像加相框
今天我们要实现一个给头像加相框功能的小程序。
大约分三个步骤
1.在有相框列表的页面上传图片
2.进行裁剪或者旋转功能
这里用到的头像裁剪插件是https://github.com/wx-plugin/image-cropper
3.生成头像保存到本地

上代码!

//选择用户自己头像图片
  upload() {
    wx.chooseImage({
      count: 1, // 默认9
      sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
      sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
      success(res) {
        const src = res.tempFilePaths[0]
        //将选择的图传至cropper页处理
        wx.navigateTo({
          url: `../cropper/cropper?src=${src}`
        })
      }
    })
  }

上传图片拿到图片的路径传到cropper页面去,cropper就是裁剪页面。在这个文件进行裁剪和旋转等方法的编写。
先把image-cropper文件放到与cropper同目录中,然后在cropper中引入。
cropper文件
cropper.json文件中添加image-cropper

{
  "navigationBarTitleText": "裁剪图片",
    "navigationBarBackgroundColor": "#000",
  "usingComponents": {
    "image-cropper": "../image-cropper/image-cropper"
  }
}

cropper.wxml


    
        取消
        旋转
        确定
    

cropper.wxss

page{
  background:rgb(14, 13, 13);
}
.bottom{
  position: absolute;
  width:100%;
  bottom:50rpx;
  display: flex;
  z-index: 10;
  justify-content: space-around;
  color:#fff;
}

cropper.js

Page({
  data: {
    src:'',
    width: 300,//宽度
    height: 300,//高度
  },
  onLoad: function (options) {
    this.cropper = this.selectComponent("#image-cropper");
    this.setData({
      src: options.src
    });
  },
  cropperload(e) {
    console.log('cropper加载完成');
  },
  loadimage(e){
    wx.hideLoading();
    this.cropper.imgReset();
  },
  clickcut(e) {
    //图片预览
    wx.previewImage({
      current: e.detail.url, // 当前显示图片的http链接
      urls: [e.detail.url] // 需要预览的图片http链接列表
    })
  },
 
  rotate() {
    //在用户旋转的基础上旋转90°
    this.cropper.setAngle(this.cropper.data.angle += 90);
  },
  end(e) {
    clearInterval(this.data[e.currentTarget.dataset.type]);
  },
  confirm(e){
    this.cropper.getImg(function(e){
      console.log(e)
      let avatar = e.url;
        //获取到裁剪后的图片传到保存页面去
        wx.redirectTo({
          url: `../savePic/savePic?avatar=${avatar}`
        })
    })
  },
  //取消返回上一页面
  cancel(){
    wx.navigateBack({
      url:'../makePic/makePic'
    })
  }
  
})

savePic–保存图片文件
savePic.wxml


            
                
                    长按头像保存
                
            
        
	    
	      
	        
	          
	           
		       
		          
		            
	            
	             
	          
	         
	      
  重新生成

savePic.js

const app = getApp();   
Page({
  data: {
    src: '',
    bgsrc: '',
    bgcss: '',
    layerShow:true,
    timer: '',//定时器名字
    countDownNum: '60'//倒计时初始值
  },
  goMakePic(){
    wx.navigateTo({
      url: '/pages/makePic/makePic',
    })
  },
  countdown(){
    let that=this;
    let countDownNum = that.data.countDownNum;
    that.setData({
    timer:setInterval(function(){
      countDownNum--;
      that.setData({
        countDownNum: countDownNum,
        layerShow:false
      })
      if(countDownNum==0){
        clearInterval(that.data.timer)
      }
    },2000)
    })

  },
  onLoad(option) {
    var that = this;
    var bgcss = app.globalData.toubgsrc.substr(14, 2);
    //此处的app.globalData.toubgsrc是一个全局变量 在相框列表拿到被选中的相框
    that.setData({
      bgsrc: app.globalData.toubgsrc,
      bgcss: bgcss
    });
  
    let { avatar } = option;
    if (avatar) {
      that.setData({
        src: avatar
      });
    }
  },
  onReady(){
    this.countdown();
  },
  //生成头像
  generate() {
    var self = this;
    var contex = wx.createCanvasContext('ahaucanvas'); 
    var avatarurl_width = 840; //画布宽
    var avatarurl_heigth = 840; //画布高
    contex.drawImage(self.data.src, 127, 127,600,600);
    contex.restore();
    contex.save();
    contex.beginPath(); //开始绘制
    contex.drawImage(self.data.bgsrc, 0, 0, avatarurl_width, avatarurl_heigth); 
    contex.restore();
    contex.draw(true, setTimeout(function () {
      wx.canvasToTempFilePath({ //导出图片
        width: 840,
        height: 840,
        destWidth: 840,
        destHeight: 840,
        canvasId: 'ahaucanvas',
        success: res => {
          wx.saveImageToPhotosAlbum({
            filePath: res.tempFilePath,
            success: function (data) {
              console.log(data);
              wx.showToast({
                title: '保存成功',
                icon: 'success',
                duration: 2000
              })
            },
            fail: function (err) {
              if (err.errMsg === "saveImageToPhotosAlbum:fail auth deny") {
                // console.log("用户拒绝,再次发起授权")
                wx.openSetting({
                  success(settingdata) {
                    console.log(settingdata)
                    if (settingdata.authSetting['scope.writePhotosAlbum']) {
                      // console.log('获取权限成功,给出再次点击图片保存到相册的提示。')
                      wx.showToast({
                        title: '请再次保存',
                        icon: 'success',
                        duration: 2000
                      })
                    } 
                  }
                })
              }
            }
          })
        }
      }, this)
    }, 100))
  },
  goMakePic(){
    wx.navigateTo({
      url: '/pages/makePic/makePic',
    })
  }
})

一个头像加相框的小程序就差不多做好了。不是很完美,还请大家多多指教O(∩_∩)O

你可能感兴趣的:(微信小程序,微信小程序,头像,前端)