// 压缩图片
/*
config= {
  width: 100, // 压缩后图片的宽
  height: 100, // 压缩后图片的高  如果宽高只传一个值,则保持原比例压缩
  quality: 1 // 图片品质(清晰度),取值0-1,
}
*/
export function compressImage(file, config) {
  let files
  let fileSize = parseFloat(parseInt(file['size']) / 1024 / 1024).toFixed(2)
  const read = new FileReader()
  read.readAsDataURL(file)
  return new Promise(function (resolve) {
    read.onload = function (e) {
      let img = new Image()
      img.src = e.target.result
      img.onload = function () {
        console.log(this.width, this.height)
        // 默认按比例压缩
        const { w, h } = changeRatio(this, config)

        // 生成canvas
        let canvas = document.createElement('canvas')
        let ctx = canvas.getContext('2d')
        let base64
        // 创建属性节点
        canvas.setAttribute('width', w)
        canvas.setAttribute('height', h)
        ctx.drawImage(this, 0, 0, w, h)

        if (fileSize < 1) {
          //如果图片小于1M 那么不执行压缩操作
          base64 = canvas.toDataURL(file['type'], config.quality || 1)
        } else if (fileSize > 1 && fileSize < 2) {
          //如果图片大于1M并且小于2M 那么压缩0.5
          base64 = canvas.toDataURL(file['type'], 0.5);
        } else {
          //如果图片超过2m 那么压缩0.2
          base64 = canvas.toDataURL(file['type'], 0.2);
        }
        // 回调函数返回file的值(将base64编码转成file)
        files = dataURLtoFile(base64, file['name'])
        resolve(files)
      }
    }
  })
};

// base64转码(将base64编码转回file文件)  
function dataURLtoFile(dataurl, fileName) {
  let arr = dataurl.split(',')
  let mime = arr[0].match(/:(.*?);/)[1]
  let bstr = atob(arr[1])
  let n = bstr.length
  let u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new File([u8arr], fileName, { type: mime })
}

// 设置图片比例
function changeRatio(img, config) {
  let w = img.width;
  let h = img.height;
  // 图片比例
  let ratio = img.width / img.height
  if (config.width && !config.height) {
    w = config.width;
    h = w / ratio;
  } else if (!config.width && config.height) {
    h = config.height;
    w = h * ratio;
  } else if (config.width && config.height) {
    w = config.width;
    h = config.height;
  }
  return {
    w: w,
    h: h
  }
}