基于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 相关文章推荐
extjs 列表框(multiselect)的动态添加列表项的方法
Jul 31 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
Nov 18 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
Nov 23 Javascript
jQuery实现滚动切换的tab选项卡效果代码
Aug 26 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
Mar 10 Javascript
jQuery插件实现文件上传功能(支持拖拽)
Aug 27 Javascript
Angular2平滑升级到Angular4的步骤详解
Mar 29 Javascript
微信小程序页面滑动屏幕加载数据效果
Nov 16 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
Oct 21 Javascript
Vue+Element-UI实现上传图片并压缩
Nov 26 Javascript
javascript实现留言板功能
Feb 08 Javascript
基于原生JS封装的Modal对话框插件的示例代码
Sep 09 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
PHP 和 MySQL 基础教程(一)
2006/10/09 PHP
php中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
提升PHP性能的21种方法介绍
2013/06/25 PHP
CMS中PHP判断系统是否已经安装的方法示例
2014/07/26 PHP
php异常处理方法实例汇总
2015/06/24 PHP
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
javascript中call,apply,bind的用法对比分析
2015/02/12 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
python实现上传下载文件功能
2020/11/19 Python
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
工作时间上网检讨书
2014/02/03 职场文书
会计的岗位职责
2014/03/15 职场文书
设备管理实施方案
2014/05/31 职场文书
校庆口号
2014/06/20 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
环卫个人总结
2015/03/03 职场文书
交通事故被告代理词
2015/05/23 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
自荐信范文
2019/05/20 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
解析MySQL索引的作用
2022/03/03 MySQL