js前端压缩图片方法

png格式无法压缩

核心函数

//图片压缩
const compressUpload = (image, file) => {
  if (!(image instanceof Image)) {
    throw new Error('Invalid image object');
  }
  //压缩到100kb
  const size = 1024 * 100
  //压缩率
  const compressibility = size / file.size
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  const { width } = image;
  const { height } = image;
  canvas.width = width;
  canvas.height = height;
  ctx?.fillRect(0, 0, canvas.width, canvas.height);
  ctx?.drawImage(image, 0, 0, width, height);
  const compressData = canvas.toDataURL(file.type ?? 'image/jpeg', compressibility);
  const blobImg = dataURItoBlob(compressData);

  return blobImg;
};

//转换二进制
const dataURItoBlob = (data) => {
  const dataArray = data.split(',');
  const contentType = dataArray[0];
  const dataContent = dataArray[1];

  const byteString = contentType.indexOf('base64') >= 0 ? atob(dataContent) : decodeURI(dataContent);

  const [, mimeType] = contentType.split(':');
  const [type] = mimeType.split(';');

  const ia = new Uint8Array(byteString.length);
  byteString.split('').forEach((char, i) => {
    ia[i] = char.charCodeAt(0);
  });

  return new Blob([ia], { type });
};

用法

以antD的upload组件为例

const onBeforeUpload = (file) => {
  return new Promise((resolve, reject) => {
    const image = new Image()
    image.src = URL.createObjectURL(file)
    image.onload = () => {
      const blobImg = compressUpload(image, file)
      resolve(blobImg)
    }
    image.onerror = (error) => {
      reject(error)
    }
  })
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值