如何获取图片存储大小

188 阅读1分钟

1. url -> blob -> file

url转blob 有两种方法分别是xhr方法和canvas方法

// url-->blob   xhr方法
export function urlToBlob(src: string) {
 if (src === '') return;
 const xhr = new XMLHttpRequest();
 let blob;
 xhr.open('GET', src);
 xhr.responseType = 'blob'; //二进制文件
 xhr.onload = function () {
 blob = this.response;
 return blob;
  };
 // xhr.onload((res) => {});
 xhr.send();
 console.log(xhr.response);
}

// url-->blob   canvas方法
// 根据地址(src)获取图片,生成img对象(标签)
export function getImg(src: string) {
 return new Promise((resolve, reject) => {
 const img = new Image();
 img.src = src;
 // 源图片允许跨域,否则canvas转base64时,toDataURL会报错
 img.setAttribute('crossOrigin', 'anonymous');
 img.onload = function () {
 resolve(img);
    };
  });
}

// 绘制图片并将canvas转为blob
export function canvasToBlob(img) {
 return new Promise((resolve, reject) => {
 const canvas = document.createElement('canvas');
 canvas.width = img.width;
 canvas.height = img.height;

 const ctx = canvas.getContext('2d');
 // 绘制原图(大小自己限制啦)
 ctx.drawImage(img, 0, 0);
 /* 转为blob对象 toBlob方法第一个参数是回调函数,第二个是图片格式默认值image/png,第三个为图片质量 */
 canvas.toBlob((blob) => {
 console.log('blob:', blob);
 resolve(blob);
 const url = URL.createObjectURL(blob);
 URL.revokeObjectURL(url);
    });
  });
}

转换为blob就可以获取字节数,然后转换为存储大小

export function getFileSize(size: number): ISize {
  //把字节转换成正常文件大小
  if (!size) return { res: 0, unit: '' };
  const num = 1024.0; //byte
  if (size < num) return { res: size, unit: 'B' };
  if (size < Math.pow(num, 2))
    return { res: Number((size / num).toFixed(2)), unit: 'KB' }; //kb
  if (size < Math.pow(num, 3))
    return { res: Number((size / Math.pow(num, 2)).toFixed(2)), unit: 'MB' }; //M
  if (size < Math.pow(num, 4))
    return { res: Number((size / Math.pow(num, 3)).toFixed(2)), unit: 'G' }; //G
  return { res: Number((size / Math.pow(num, 4)).toFixed(2)), unit: 'T' }; //T
}

2. url -> base64  -> file

   urlToBase64 () {
      let me = this
      // 获取图片的type
      let type = src.slice(src.lastIndexOf('.') + 1, src.length)
      var canvas = document.createElement('canvas');
      var img = document.createElement('img');
      // 设置可以跨域
      img.setAttribute('crossOrigin', 'anonymous')
      img.onload = function(e) {
          canvas.width = img.width;
          canvas.height = img.height;
          var context = canvas.getContext('2d');
          context.drawImage(img, 0, 0, img.width, img.height);
          document.body.append(canvas)
          let base64 = canvas.toDataURL('image/' + type)
          return base64
      }
      img.src = src;
   }
    //  base64 => file
    dataURLtoFile (dataurl, filename, src) {
      var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
          bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
      while(n--){
          u8arr[n] = bstr.charCodeAt(n);
      }
      let file = new File([u8arr], filename, {type:mime});
      return file 
    },