基于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版代码高亮
Jun 26 Javascript
JavaScript面向对象编程
Mar 02 Javascript
js 巧妙去除数组中的重复项
Jan 25 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
Apr 26 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 Javascript
jQuery遍历DOM元素与节点方法详解
Apr 14 Javascript
JavaScript预解析及相关技巧分析
Apr 21 Javascript
jquery获取复选框checkbox的值实现方法
May 30 Javascript
第一次接触神奇的Bootstrap基础排版
Jul 26 Javascript
JavaScript html5 canvas实现图片上画超链接
Oct 20 Javascript
Vue实现导出excel表格功能
Mar 30 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
Nov 11 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验证码类代码分享(已封装成类)
2011/07/17 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
js中new一个对象的过程
2017/02/20 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
Python与shell的3种交互方式介绍
2015/04/11 Python
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
python在不同层级目录import模块的方法
2016/01/31 Python
Python 装饰器深入理解
2017/03/16 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
Django组件cookie与session的具体使用
2019/06/05 Python
Python Scrapy框架第一个入门程序示例
2020/02/05 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
大课间活动实施方案
2014/03/06 职场文书
商超业务员岗位职责
2014/03/12 职场文书
安全标语口号
2014/06/09 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
追悼会家属答谢词
2015/09/29 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
python实现自定义日志的具体方法
2021/05/28 Python