欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于JS实现前端压缩上传图片的实例代码

程序员文章站 2023-12-01 19:23:58
具体代码如下所示:

具体代码如下所示:

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>前端压缩上传图片</title>
  <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
  <input type="file" id="picfile" onchange="readfile(this)" />
  <img id="img" src="" alt="" />
  <script>
    function readfile(obj) {
      var file = obj.files[0];
      //判断类型是不是图片 
      if (!/image\/\w+/.test(file.type)) {
        alert("请确保文件为图像类型");
        return false;
      }
      var reader = new filereader();
      reader.readasdataurl(file);
      reader.onload = function(e) {
        dealimage(this.result, { quality: 0.5 }, function(base) {
          //调用
          var blob = dataurltoblob(base);
          var newfile = new file([blob], file.name, { type: file.type });
          console.log(newfile)
          let r = new filereader(); //本地预览
          r.onload = function() {
            $('#img').attr("src", r.result);;
          }
          r.readasdataurl(newfile); //base64
          // upload(newfile);
        });
      }
    }
    //将base64转换为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 });
    }
    function upload(file) {
      var that = this;
      // 创建form对象
      let param = new formdata();
      // 通过append向form对象添加数据
      param.append('img', file);
      // 文件大小
      param.append('size', file.size);
      for (var n in that.params) {
        param.append(n, that.params[n]);
      }
      // 创建ajax
      var xhr = new xmlhttprequest();
      xhr.onload = function() {
        console.log(xhr.responsetext)
      }
      xhr.open("post", "yourapi", true);
      // 发送表单数据
      xhr.send(param);
    }
    /**
     * 图片压缩,默认同比例压缩
     * @param {object} path
     * pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径
     * @param {object} obj
     * obj 对象 有 width, height, quality(0-1)
     * @param {object} callback
     * 回调函数有一个参数,base64的字符串数据
     */
    function dealimage(path, obj, callback) {
      var img = new image();
      img.src = path;
      img.onload = function() {
        var that = this;
        // 默认按比例压缩
        var w = that.width,
          h = that.height,
          scale = w / h;
        w = obj.width || w;
        h = obj.height || (w / scale);
        var quality = obj.quality || 0.7; // 默认图片质量为0.7
        //生成canvas
        var canvas = document.createelement('canvas');
        var ctx = canvas.getcontext('2d');
        // 创建属性节点
        var anw = document.createattribute("width");
        anw.nodevalue = w;
        var anh = document.createattribute("height");
        anh.nodevalue = h;
        canvas.setattributenode(anw);
        canvas.setattributenode(anh);
        ctx.drawimage(that, 0, 0, w, h);
        // 图像质量
        if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
          quality = obj.quality;
        }
        // quality值越小,所绘制出的图像越模糊
        var base64 = canvas.todataurl('image/jpeg', quality);
        // 回调函数返回base64的值
        callback(base64);
      }
    }
  </script>
</body>
</html>

总结

以上所述是小编给大家介绍的基于js实现前端压缩上传图片的实例代码,希望对大家有所帮助