基于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对象的函数
Dec 22 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
Dec 28 Javascript
解析John Resig Simple JavaScript Inheritance代码
Dec 03 Javascript
JavaScript实现twitter puddles算法实例
Dec 06 Javascript
jQuery实现仿百度帖吧头部固定导航效果
Aug 07 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
May 03 Javascript
简单易懂的天气插件(代码分享)
Feb 04 Javascript
JS数组搜索之折半搜索实现方法分析
Mar 27 Javascript
JS基于递归实现网页版计算器的方法分析
Dec 20 Javascript
Laravel admin实现消息提醒、播放音频功能
Jul 10 Javascript
详解element-ui中表单验证的三种方式
Sep 18 Javascript
js实现录音上传功能
Nov 22 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 JSON 数据解析代码
2010/05/26 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
php调用shell的方法
2014/11/05 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
Bootstrap3学习笔记(二)之排版
2016/05/20 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
Python pickle模块用法实例分析
2015/05/27 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
python自动结束mysql慢查询会话的实例代码
2019/10/27 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
皇马官方商城:Real Madrid Store
2016/09/02 全球购物
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
Puccini乌克兰:购买行李箱、女士手袋网上商店
2020/08/06 全球购物
一份Java笔试题
2012/02/21 面试题
元旦寄语大全
2014/04/10 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
佛光寺导游词
2015/02/10 职场文书
行政撤诉申请书
2015/05/18 职场文书
班级联欢会主持词
2015/07/03 职场文书
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python