图片压缩方案整理

写于 2017-08-10 | 分类于 编程

现在手机的像素都老高了,前端做图片上传时最好先压缩一下图片大小再进行上传,这样就避免浪费用户的流量,体验也更好。

方案整理:

  • 方案一:用Canvas的toDataUrl可以将内容导出为base64编码格式的图片,默认采用base64编码将比源文件大1/3,但可以指定导出图片质量,实现上传图片的压缩
  • 方案二:将文件读取为dataURL,重新new Image()时按所需比例设置图片的宽度width和高度height可以自动压缩图片大小

核心方法:

  • canvas转换为dataURL
    canvas.toDataURL('image/jpeg', 0.8)
    
  • File对象转换为dataURL、Blob对象转换为dataURL
    function readBlobAsDataURL(blob, callback) {
      var a = new FileReader();
      a.onload = function(e) {callback(e.target.result);};
      a.readAsDataURL(blob);
    }
    
  • dataURL转换为Blob对象
    function dataURLtoBlob(dataurl) {
      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);
      }
      return new Blob([u8arr], {type:mime});
    }
    
  • dataURL图片数据绘制到canvas
    var img = new Image();
    img.onload = function(){
      canvas.drawImage(img);
    };
    img.src = dataurl;
    
  • File,Blob的图片文件数据绘制到canvas
    readBlobAsDataURL(file, function (dataurl){
      var img = new Image();
      img.onload = function(){
          canvas.drawImage(img);
      };
      img.src = dataurl;
    });
    
  • Canvas转换为Blob对象并使用Ajax发送
    var dataurl = canvas.toDataURL('image/png');
    var blob = dataURLtoBlob(dataurl);
    //使用ajax发送
    var fd = new FormData();
    fd.append("image", blob, "image.png");
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/server', true);
    xhr.send(fd)
    

参考资料