Vue项目,上传图片时,解决图片旋转问题

问题:三星手机拍照时,正面拍照照片会旋转,左横拍才会正常。如下图所示

image
image
image

上传之后,就是这亚子,由于后台需要读取正脸照,去匹配,显然这亚子不行。

解决后:

image

**解决问题:使用exif.js来获取图像数据,然后进行处理 **

1. 安装依赖 npm install exif-js --save

  1. 引用依赖 import EXIF from 'exif-js';

3. 获取图像数据 EXIF.getData();
获取某个数据方向参数 EXIF.getTag(this, 'Orientation');

代码如下

// 处理图片旋转 方法
handleImgRotate(target, listName) { 
      let canvas = document.createElement('canvas'); 
      let ctx = canvas.getContext('2d'); 
      let orientation = null; 
      let imgObj = target; 
      let _this = this;
      // 图片压缩 
      if (imgObj && imgObj.width > 1000 && imgObj.height > 1000) { 
              imgObj.width = imgObj.width / 6; 
              imgObj.height = imgObj.height / 6; 
      }
 
    EXIF.getData(imgObj, function() { 
        // 获取某个数据方向参数 
       orientation = EXIF.getTag(this, 'Orientation'); 
        // 为6的时候,图片需宽高反转
         if (orientation && orientation == 6 && imgObj.width > imgObj.height) {
             canvas.width = imgObj.height; 
             canvas.height = imgObj.width; 
         } else {
             canvas.width = imgObj.width; 
             canvas.height = imgObj.height; 
         } 
         ctx.drawImage(imgObj, 0, 0, imgObj.width, imgObj.height);
         if (orientation) { 
             // 为1,正常 
             switch (Number(orientation)) { 
                 case 3: // 需要180度旋转 
                      ctx.rotate(180 * Math.PI / 180); 
                      ctx.drawImage(imgObj, -imgObj.width, -imgObj.height, imgObj.width, imgObj.height); 
                  break; 

                case 6: // 需要顺时针(向左)90度旋转 
                     ctx.rotate(90 * Math.PI / 180); 
                     ctx.drawImage(imgObj, 0, 0, imgObj.width, -imgObj.height); 
                break;
                case 8: // 需要逆时针(向右)90度旋转 
                   ctx.rotate(270 * Math.PI / 180); 
                   ctx.drawImage(imgObj, -imgObj.height, 0, imgObj.height, imgObj.width); 
               break; 
               default:
                     ctx.drawImage(imgObj, 0, 0, imgObj.width, imgObj.height); 
                     break; 
              }
 
     } 

     _this[listName].push({ image: canvas.toDataURL('image/jpeg')});
 
}); 
return _this[listName];

遇到问题,使用的 element-ui 框架里的el-upload组件,上传成功后,无法读取上传后image的图片信息

解决问题:需要循环出所有图片,并load加载方法,获取信息

//  在el-upload中调用改变后的方法
 <el-upload
      class="avatar-uploader" 
      :action="uploadUrl" 
      :show-file-list="false" 
      :auto-upload="false"
      multiple 
      :on-change="imageChange"
    <img style="display: none;" v-for="(item, index) in avatarList" :key="index" :src="item.image" @load="avatarCallback($event)" /> 
</el-upload>

imageChange(file, fileList) { 
      this.avatarList = []; // 用于图片需重新load加载
      this.avatarListBase = [];  // 改变一次时,需清空之前数据
      fileList.forEach((item) => { 
          this.avatarList.push(
            {image:     URL.createObjectURL(item.raw)}); }
         ); 
},
avatarCallback(e) {      
     let data = this.handleImgRotate(e.target);  // 调用处理旋转的方法     
     this.avatarListBase.push(data);   // 添加到一个数组中,用于接口上传参数时
}

// 上传接口时:需将base64URL转换为file
dataURLtoFile(dataurl, filename) { 
      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 File([u8arr], filename, {type: mime});
 },
 addWhiteUser() {
     this.avatarListBase.forEach((item, index) => { 
         let formData = new FormData();
           let raw = this.dataURLtoFile(this.avatarListBase[index].image, 'face' + index + '.jpg'); 
          formData.append('imgs['+[index]+']', raw); });
   });
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容