项目中遇到了这个问题,在搜索过程中看到别人的博文,大多是下面这种方法,大致如下:

let imgObj = {
  count: 1,
  success: (res) => {
    let tempFilePaths = res.tempFilePaths;
    wx.request({
      url: tempFilePaths[0],
      responseType: 'arraybuffer',
      success: function (res) {
        let base64 = wx.arrayBufferToBase64(res.data);
      }
    });
  },
  fail: (res) => {
    wx.showToast({
      title: res,
      icon:'none'
    });
  }
}
wx.chooseImage(imgObj);

开发者工具中是可以获取到的,但是拿手机预览或者真机调试的时候,获取base64这个方法的url是不能用临时路径的,所以这个方法也就走不通了,那么就只能借助canvas了。

首先在wxml文件中写一个canvas

<canvas canvas-id='canvas' class='canvas'></canvas>

js文件中需要引入插件upng.js

const upng = require('../../common/libs/upng-js/UPNG.js')

获取base64代码如下:

let _this = this;
let imgObj = {
  count: 1,
  success: (res) => {
    let tempPath = res.tempFilePaths[0];
    wx.showLoading({
      title: '图片加载中',
      mask: true,
    });
    //获取图片的宽高
    wx.getImageInfo({
      src: tempPath,
      success: res => {
        let ratio = 2;
        let canvasWidth = res.width
        let canvasHeight = res.height;
        // 保证宽高均在300以内
        while (canvasWidth > 300 || canvasHeight > 300) {
          //比例取整
          canvasWidth = Math.trunc(res.width / ratio)
          canvasHeight = Math.trunc(res.height / ratio)
          ratio++;
        }
        _this.setData({
          imgWidth: canvasWidth,
          imgHeight: canvasHeight
        })
        let canvas = wx.createCanvasContext('canvas');
        // 绘制图片至canvas
        canvas.drawImage(tempPath, 0, 0, _this.data.imgWidth, _this.data.imgHeight);
        // 绘制完成后
        canvas.draw(false, () => {
          //获取图像数据
          wx.canvasGetImageData({
            canvasId: 'canvas',
            x: 0,
            y: 0,
            width: _this.data.imgWidth,
            height: _this.data.imgHeight,
            success(res) {
              // 获取png编码
              let pngData = upng.encode([res.data.buffer], res.width, res.height);
              // 获取base64
              let base64 = wx.arrayBufferToBase64(pngData);
            },
            fail(res) {

            },
            complete(){
              wx.hideLoading();
            }
          })
        })
      },
      fail: res => {
        wx.hideLoading()
      }
    })
  },
  fail: (res) => {
    
  }
};
wx.chooseImage(imgObj);

代码中限制了图片大小在300以内,所以只需要设置canvas的宽高大于300px即可,这样可以有效地限制绘制图片的大小以及获取到base64的大小,从而也缩短了转化base64的时间。

注:尽量还是用wx.uploadFile做图片上传,公司项目中虽然用该方法获取到了图片的base64编码,但是最终还是用uploadFile做的图片上传。

如有表述不准确之处,欢迎指正,欢迎补充,感谢阅读。