vue上传图片压缩

   日期:2020-08-28     浏览:87    评论:0    
核心提示:自己的随手笔记,分享给大家,如果有不足或者建议请大家多多指教,如果有问题请加 QQ(1445579000) 说明来意接各类软件开发项目及其各类私活,价格最优由于最近项目需要用到上传压缩图片在网上找了一些资料不太好用,在git上找了一下这个压缩框架非常好用,也非常简单,适合一个页面多个上传图片和单个上传图片使用,多个上传图片可以封装一下,这边我就不上传多个封装得代码了,只给大家分享一下单个上传吧1.首先第一步先npm install exif-js --save 安装插件2.然后impor..

自己的随手笔记,分享给大家,如果有不足或者建议请大家多多指教,如果有问题请加 QQ(1445579000) 说明来意

接各类软件开发项目及其各类私活,价格最优

由于最近项目需要用到上传压缩图片在网上找了一些资料不太好用,在git上找了一下这个压缩框架非常好用,也非常简单,适合一个页面多个上传图片和单个上传图片使用,多个上传图片可以封装一下,这边我就不上传多个封装得代码了,只给大家分享一下单个上传吧

1.首先第一步先npm install exif-js --save   安装插件

2.然后import引入一下就可以使用了

接下来就是代码了

  changeImage(e) {
          let files = e.target.files || e.dataTransfer.files;
          if (!files.length) return;
          this.picValue = files[0];
          this.imgPreview(this.picValue);
          },
            imgPreview (file) {
                let self = this;
                let Orientation;
                //去获取拍照时的信息,解决拍出来的照片旋转问题
                Exif.getData(file, function(){
                    Orientation = Exif.getTag(this, 'Orientation');
                });
                // 看支持不支持FileReader
                if (!file || !window.FileReader) return;

                if (/^image/.test(file.type)) {
                    // 创建一个reader
                    let reader = new FileReader();
                    // 将图片2将转成 base64 格式
                    reader.readAsDataURL(file);
                    // 读取成功后的回调
                    reader.onloadend = function () {
                      let result = this.result;
                      let img = new Image();
                      img.src = result;
                      //判断图片是否大于100K,是就直接上传,反之压缩图片
                      if (this.result.length <= (100 * 1024)) {
                        self.headerImage = this.result;
                        self.postImg();
                      }else {
                        img.onload = function () {
                          let data = self.compress(img,Orientation);
                          self.headerImage = data;
                          self.postImg();
                        }
                      }
                    }
                  }
                },
           //调用接口得代码 根据自己调用接口得逻辑自行处理
             postImg () {
                    //无非就是调用接口 压缩过得图片base64编码传递给你的接口就好了
                  },
              rotateImg (img, direction,canvas) {
                     //最小与最大旋转方向,图片旋转4次后回到原方向
                     const min_step = 0;
                     const max_step = 3;
                     if (img == null)return;
                     //img的高度和宽度不能在img元素隐藏后获取,否则会出错
                     let height = img.height;
                     let width = img.width;
                     let step = 2;
                     if (step == null) {
                         step = min_step;
                     }
                     if (direction == 'right') {
                         step++;
                         //旋转到原位置,即超过最大值
                         step > max_step && (step = min_step);
                     } else {
                         step--;
                         step < min_step && (step = max_step);
                     }
                     //旋转角度以弧度值为参数
                     let degree = step * 90 * Math.PI / 180;
                     let ctx = canvas.getContext('2d');
                     switch (step) {
                       case 0:
                           canvas.width = width;
                           canvas.height = height;
                           ctx.drawImage(img, 0, 0);
                           break;
                       case 1:
                           canvas.width = height;
                           canvas.height = width;
                           ctx.rotate(degree);
                           ctx.drawImage(img, 0, -height);
                           break;
                       case 2:
                           canvas.width = width;
                           canvas.height = height;
                           ctx.rotate(degree);
                           ctx.drawImage(img, -width, -height);
                           break;
                       case 3:
                           canvas.width = height;
                           canvas.height = width;
                           ctx.rotate(degree);
                           ctx.drawImage(img, -width, 0);
                           break;
                     }
                 },
                 compress(img,Orientation) {
                   let canvas = document.createElement("canvas");
                   let ctx = canvas.getContext('2d');
                     //瓦片canvas
                   let tCanvas = document.createElement("canvas");
                   let tctx = tCanvas.getContext("2d");
                   let initSize = img.src.length;
                   let width = img.width;
                   let height = img.height;
                   //如果图片大于四百万像素,计算压缩比并将大小压至400万以下
                   let ratio;
                   if ((ratio = width * height / 4000000) > 1) {
                     console.log("大于400万像素")
                     ratio = Math.sqrt(ratio);
                     width /= ratio;
                     height /= ratio;
                   } else {
                     ratio = 1;
                   }
                   canvas.width = width;
                   canvas.height = height;
               //        铺底色
                   ctx.fillStyle = "#fff";
                   ctx.fillRect(0, 0, canvas.width, canvas.height);
                   //如果图片像素大于100万则使用瓦片绘制
                   let count;
                   if ((count = width * height / 1000000) > 1) {
                     console.log("超过100W像素");
                     count = ~~(Math.sqrt(count) + 1); //计算要分成多少块瓦片
               //            计算每块瓦片的宽和高
                     let nw = ~~(width / count);
                     let nh = ~~(height / count);
                     tCanvas.width = nw;
                     tCanvas.height = nh;
                     for (let i = 0; i < count; i++) {
                       for (let j = 0; j < count; j++) {
                         tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh);
                         ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh);
                       }
                     }
                   } else {
                     ctx.drawImage(img, 0, 0, width, height);
                   }
                   //修复ios上传图片的时候 被旋转的问题
                   if(Orientation != "" && Orientation != 1){
                     switch(Orientation){
                       case 6://需要顺时针(向左)90度旋转
                           this.rotateImg(img,'left',canvas);
                           break;
                       case 8://需要逆时针(向右)90度旋转
                           this.rotateImg(img,'right',canvas);
                           break;
                       case 3://需要180度旋转
                           this.rotateImg(img,'right',canvas);//转两次
                           this.rotateImg(img,'right',canvas);
                           break;
                     }
                   }
                   //进行最小压缩  ndata 就是压缩过的base64编码
                   let ndata = canvas.toDataURL('image/jpeg', 0.1);
                   console.log('压缩前:' + initSize);
                   console.log('压缩后:' + ndata.length);
                   console.log('压缩率:' + ~~(100 * (initSize - ndata.length) / initSize) + "%");
                   console.log()
                   
                   tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0;
                   return ndata;
                 },

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服