欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

前端压缩上传图片

程序员文章站 2022-06-27 22:16:01
1 2 3 4 5 6 前端压缩上传图片 7 8 9 10 11 12 13 121 122 123 ......
  1 <!doctype html>
  2 <html>
  3 
  4 <head>
  5     <meta charset="utf-8">
  6     <title>前端压缩上传图片</title>
  7     <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
  8 </head>
  9 
 10 <body>
 11     <input type="file" id="picfile" onchange="readfile(this)" />
 12     <img id="img" src="" alt="" />
 13     <script>
 14         function readfile(obj) {
 15             var file = obj.files[0];
 16             //判断类型是不是图片 
 17             if (!/image\/\w+/.test(file.type)) {
 18                 alert("请确保文件为图像类型");
 19                 return false;
 20             }
 21             var reader = new filereader();
 22             reader.readasdataurl(file);
 23             reader.onload = function(e) {
 24                 dealimage(this.result, { quality: 0.5 }, function(base) {
 25                     //调用
 26                     var blob = dataurltoblob(base);
 27                     var newfile = new file([blob], file.name, { type: file.type });
 28                     console.log(newfile)
 29 
 30                     let r = new filereader(); //本地预览
 31                     r.onload = function() {
 32                         $('#img').attr("src", r.result);;
 33                     }
 34                     r.readasdataurl(newfile); //base64
 35 
 36                     // upload(newfile);
 37                 });
 38             }
 39         }
 40 
 41         //将base64转换为blob
 42         function dataurltoblob(dataurl) {
 43             var arr = dataurl.split(','),
 44                 mime = arr[0].match(/:(.*?);/)[1],
 45                 bstr = atob(arr[1]),
 46                 n = bstr.length,
 47                 u8arr = new uint8array(n);
 48             while (n--) {
 49                 u8arr[n] = bstr.charcodeat(n);
 50             }
 51             return new blob([u8arr], { type: mime });
 52         }
 53 
 54 
 55         function upload(file) {
 56             var that = this;
 57             // 创建form对象
 58             let param = new formdata();
 59             // 通过append向form对象添加数据
 60             param.append('img', file);
 61             // 文件大小
 62             param.append('size', file.size);
 63             for (var n in that.params) {
 64                 param.append(n, that.params[n]);
 65             }
 66             
 67             // 创建ajax
 68             var xhr = new xmlhttprequest();
 69 
 70             xhr.onload = function() {
 71                 console.log(xhr.responsetext)
 72             }
 73             xhr.open("post", "yourapi", true);
 74 
 75             // 发送表单数据
 76             xhr.send(param);
 77         }
 78         /**
 79          * 图片压缩,默认同比例压缩
 80          * @param {object} path
 81          * pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径
 82          * @param {object} obj
 83          * obj 对象 有 width, height, quality(0-1)
 84          * @param {object} callback
 85          * 回调函数有一个参数,base64的字符串数据
 86          */
 87         function dealimage(path, obj, callback) {
 88             var img = new image();
 89             img.src = path;
 90             img.onload = function() {
 91                 var that = this;
 92                 // 默认按比例压缩
 93                 var w = that.width,
 94                     h = that.height,
 95                     scale = w / h;
 96                 w = obj.width || w;
 97                 h = obj.height || (w / scale);
 98                 var quality = obj.quality || 0.7; // 默认图片质量为0.7
 99                 //生成canvas
100                 var canvas = document.createelement('canvas');
101                 var ctx = canvas.getcontext('2d');
102                 // 创建属性节点
103                 var anw = document.createattribute("width");
104                 anw.nodevalue = w;
105                 var anh = document.createattribute("height");
106                 anh.nodevalue = h;
107                 canvas.setattributenode(anw);
108                 canvas.setattributenode(anh);
109                 ctx.drawimage(that, 0, 0, w, h);
110                 // 图像质量
111                 if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
112                     quality = obj.quality;
113                 }
114                 // quality值越小,所绘制出的图像越模糊
115                 var base64 = canvas.todataurl('image/jpeg', quality);
116                 // 回调函数返回base64的值
117                 callback(base64);
118             }
119         }
120     </script>
121 </body>
122 
123 </html>