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


Posted in Javascript onMay 14, 2019

具体代码如下所示:

<!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实现前端压缩上传图片的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
js判断输入是否为数字的具体实例
Aug 03 Javascript
jQuery插件windowScroll实现单屏滚动特效
Jul 14 Javascript
RequireJS入门一之实现第一个例子
Sep 30 Javascript
JS基于Ajax实现的网页Loading效果代码
Oct 27 Javascript
javascript性能优化之DOM交互操作实例分析
Dec 12 Javascript
基于javascript简单实现对身份证校验
Jan 25 Javascript
javascript简单进制转换实现方法
Nov 24 Javascript
详解vue.js之绑定class和style的示例代码
Aug 24 Javascript
微信小程序使用Socket的实例
Sep 19 Javascript
微信小程序实现打开内置地图功能【附源码下载】
Dec 07 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
Mar 20 Javascript
laravel实现中文和英语互相切换的例子
Sep 30 Javascript
JavaScript如何实现元素全排列实例代码
May 14 #Javascript
微信小程序实现多选框全选与取消全选功能示例
May 14 #Javascript
js中arguments对象的深入理解
May 14 #Javascript
ios中视频的最后一桢问题解决
May 14 #Javascript
详解可以用在VS Code中的正则表达式小技巧
May 14 #Javascript
vue项目中引入vue-datepicker插件的详解
May 14 #Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
May 14 #jQuery
You might like
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
apache php模块整合操作指南
2012/11/16 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
2014/05/14 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
2017/03/01 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
python中OrderedDict的使用方法详解
2017/05/05 Python
Django实现分页显示效果
2019/10/31 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
python 基于opencv 绘制图像轮廓
2020/12/11 Python
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
社区党员先进事迹
2014/01/22 职场文书
关于期中考试的反思
2014/02/02 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
电子装配专业毕业生求职信
2014/04/23 职场文书
工程负责人任命书
2014/06/06 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
教师学期个人总结
2015/02/11 职场文书
入队仪式主持词
2015/07/04 职场文书
国家助学金受助感言
2015/08/01 职场文书
Java 超详细讲解数据结构中的堆的应用
2022/04/02 Java/Android