前端图片压缩到指定大小

/**
  * @description: base64图片压缩
  * @param {file} file类型文件
  *  @param {maxSizeKB} 最大压缩多少kb
  * @return {*}
*/
function compress(file,maxSizeKB){
	let Base64URL=''
	if (file.size > maxSizeKB * 1024) {
	  let rate = 0 // 压缩率
	  // 文件转图片
	  const dataUrl = await fileToImgAsync(file)
	  // // 图片转画布
	  const image= await loadImageAsync(dataUrl)
	  // 文件大小KB, file.size给的是字节Byte
	  const fileSizeKB = file.size / 1024
	  // 当图片大小超标,才进行压缩
	  if (fileSizeKB > maxSizeKB) {
		// 计算压缩率
		rate = (fileSizeKB - maxSizeKB) / fileSizeKB
		console.log('压缩率:', rate)
		console.log('压缩后文件大小:', fileSizeKB * (1 - rate), 'kb')
	  }
	  // 纠正因子,不加会导致压缩出的文件太小
	  const factor = 0.2
	  // 画布执行压缩
	  const canvas = document.createElement('canvas')
	  const context = canvas.getContext('2d')
	  const cvWidth = image.width * (1 - rate + factor)
	  const cvHeight = image.height * (1 - rate + factor)
	  canvas.height = cvHeight
	  canvas.width = cvWidth
	  context?.clearRect(0, 0, cvWidth, cvHeight)
	  context?.drawImage(image, 0, 0, cvWidth, cvHeight)
	  Base64URL = canvas.toDataURL('image/jpeg', 0.7)
	  // console.log(Base64URL, '---------Base64URL---------')
	  // return Base64URL
	}
	return Base64URL
}
  // // 异步读取图片的promise
  function loadImageAsync  (url)  {
    return new Promise(function (resolve, reject) {
    //new imag内不可以传url 或者 宽度拿不到
      const image = new Image()
      image.src = url
      image.onload = function () {
        resolve(image)
      };

      image.onerror = function () {
        reject(new Error('Could not load image at ' + url))
      };
    })
  }

  // // 异步转换成base64编码的promise
  function fileToImgAsync (file) {
    return new Promise(function (resolve, reject) {
      const reader = new FileReader()

      reader.onload =e=>{
        resolve(e.target.result);
      };

      reader.onerror = function () {
        reject(new Error('readAsDataURL:fail'))
      };

      reader.readAsDataURL(file)
    });
  }

react写法 参考https://www.cnblogs.com/ww01/p/13328664.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值