基于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 相关文章推荐
editable.js 基于jquery的表格的编辑插件
Oct 24 Javascript
计算世界完全对称日的js代码,粗糙版
Nov 04 Javascript
jquery操作checked属性以及disabled属性的多种方法
Jun 20 Javascript
js实现字符串转日期格式的方法
May 20 Javascript
javascript创建含数字字母的随机字符串方法总结
Aug 01 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
Aug 24 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
Nov 01 Javascript
用原生js做单页应用
Jan 17 Javascript
简易Vue评论框架的实现(父组件的实现)
Jan 08 Javascript
Vue项目分环境打包的实现步骤
Apr 02 Javascript
jQuery实现动态添加和删除input框代码实例
Mar 29 jQuery
微信小程序实现判断是分享到群还是个人功能示例
May 03 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数据代码
2008/06/05 PHP
php抓取页面与代码解析 推荐
2010/07/23 PHP
PHP整合PayPal支付
2015/06/11 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
JS 循环li添加点击事件 (闭包的应用)
2016/12/10 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
VUE异步更新DOM - 用$nextTick解决DOM视图的问题
2020/11/06 Javascript
Python写的服务监控程序实例
2015/01/31 Python
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
python实现linux下使用xcopy的方法
2015/06/28 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
Java中实现多态的机制
2015/08/09 面试题
员工培训心得体会
2013/12/30 职场文书
面试必备的求职信
2014/05/25 职场文书
孔庙导游词
2015/02/04 职场文书
房产遗嘱范本
2015/08/06 职场文书
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫
python+opencv实现目标跟踪过程
2022/06/21 Python