基于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 相关文章推荐
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
Aug 15 Javascript
JavaScript常用小技巧小结
Dec 29 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
Oct 30 Javascript
Window.Open打开窗体和if嵌套代码
Apr 15 Javascript
JS定义类的六种方式详解
May 12 Javascript
JS获取checkbox的个数简单实例
Aug 19 Javascript
微信小程序 加载 app-service.js 错误解决方法
Oct 12 Javascript
原生js实现瀑布流布局
Mar 08 Javascript
webpack3+React 的配置全解
Aug 21 Javascript
jQuery实现模糊查询的方法分析
May 10 jQuery
微信小程序错误this.setData报错及解决过程
Sep 18 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
Jul 15 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用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
Laravel 5 学习笔记
2015/03/06 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
python 全文检索引擎详解
2017/04/25 Python
python 判断网络连通的实现方法
2018/04/22 Python
使用python存储网页上的图片实例
2018/05/22 Python
python中的常量和变量代码详解
2018/07/25 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
python矩阵的转置和逆转实例
2018/12/12 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
详解Python IO编程
2020/07/24 Python
通过代码实例了解Python sys模块
2020/09/14 Python
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
庆元旦迎新年广播稿
2014/02/18 职场文书
保护环境的标语
2014/06/09 职场文书
安徽导游词
2015/02/12 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
python的html标准库
2022/04/29 Python