基于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 相关文章推荐
javascript实现3D变换的立体圆圈实例
Aug 06 Javascript
javascript中的3种继承实现方法
Jan 27 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
May 19 Javascript
前端js弹出框组件使用方法
Aug 24 Javascript
关于AngularJs数据的本地存储详解
Jan 20 Javascript
javascript 判断当前浏览器版本并判断ie版本
Feb 17 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
Mar 12 Javascript
vuex 项目结构目录及一些简单配置介绍
Apr 08 Javascript
学习jQuery中的noConflict()用法
Sep 28 jQuery
详解javascript中的Error对象
Apr 25 Javascript
解决微信小程序中的滚动穿透问题
Sep 16 Javascript
JavaScript交换变量的常用方法小结【4种方法】
May 07 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
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
js showModalDialog参数的使用详解
2014/01/07 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
js实现导航跟随效果
2018/11/17 Javascript
Vue中CSS动画原理的实现
2019/02/13 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
2019/07/10 jQuery
Vue.js实现立体计算器
2020/02/22 Javascript
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
Python3 filecmp模块测试比较文件原理解析
2020/03/23 Python
在阿尔卑斯山或希腊度过快乐假期:Alpine Elements
2019/12/28 全球购物
工商管理系学生的自我评价分享
2013/11/29 职场文书
玩具公司的创业计划书
2013/12/31 职场文书
党员学习十八大感想
2014/01/17 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
导游词之山东红叶谷
2019/10/31 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书
react 项目中引入图片的几种方式
2021/06/02 Javascript
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android