自己的随手笔记,分享给大家,如果有不足或者建议请大家多多指教,如果有问题请加 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;
                 },
08-30 17:23