Vue項目解決蘋果手機拍照上傳圖片翻轉(zhuǎn)問題

input type=“file”方式上傳

在項目中饶套,這里用到了input type="file"方式上傳圖片

<input @change="upImg(6)" ref="foreheadCir" type="file" accept="image/*" mutiple="mutiple">

在項目測試中發(fā)現(xiàn)掌实,使用蘋果手機點擊input標(biāo)簽直接調(diào)用相機功能上傳照片(從相冊選擇圖片上傳則正常)硕并,卻發(fā)現(xiàn)后臺接收到的圖片被翻轉(zhuǎn)了90度,而在安卓機測試卻不會右莱,最終解決的方法是:使用npm庫的exif-js插件桃笙。

解決步驟如下:

step1安裝插件:

cnpm install exif-js --save

step2在當(dāng)前組件引用插件:

import Vue from "vue";
import EXIF from "exif-js";
Vue.use(EXIF);    //全局申明

step3 獲取change事件傳遞過來的圖片(例如:this.$refs.foreheadCir.files[0])

     var Orientation = null;
        if (file) {
          if (navigator.userAgent.match(/Android/i)) {
            console.log("正在上傳,請稍后...");
            var rFilter = /^(image\/jpeg|image\/png)$/i; // 檢查圖片格式
            if (!rFilter.test(file.type)) {
              //showMyTips("請選擇jpeg氏堤、png格式的圖片", false);
              return;
            }
            console.log("2222"+Orientation);
            if (/^image/.test(file.type)) {
              // 創(chuàng)建一個reader
              var reader = new FileReader();
              // 將圖片將轉(zhuǎn)成 base64 格式
              reader.readAsDataURL(file);
              // 讀取成功后的回調(diào)
              reader.onloadend = function (e) {
                /*var obj={};
                obj["src"]=this.result;
                self.upPhoto(index,obj["src"],areaId);//傳給后臺*/
                var base64S = null;
                var img = new Image,
                  width = 2048, //image resize
                  quality = 0.8, //image quality
                  canvas = document.createElement("canvas"),
                  drawer = canvas.getContext("2d");
                  img.src = this.result;
                  img.onload = function() {
                    canvas.width = width;
                    canvas.height = width * (img.height / img.width);
                    drawer.drawImage(img, 0, 0, canvas.width, canvas.height);
                    base64S = canvas.toDataURL("image/jpeg", quality);
                    console.log(img.src);
                    self.upPhoto(index,base64S,areaId);
                  }

              }
            }
          }else{
            console.log("正在上傳,請稍后...");
            var rFilter = /^(image\/jpeg|image\/png)$/i; // 檢查圖片格式
            if (!rFilter.test(file.type)) {
              //showMyTips("請選擇jpeg、png格式的圖片", false);
              return;
            }
            // var URL = URL || webkitURL;
            //獲取照片方向角屬性搏明,用戶旋轉(zhuǎn)控制
            EXIF.getData(file, function() {
              // alert(EXIF.pretty(this));
              EXIF.getAllTags(this);
              //alert(EXIF.getTag(this, 'Orientation'));
              Orientation = EXIF.getTag(this, 'Orientation');
              //return;
            });

            var oReader = new FileReader();
            oReader.onload = function(e) {
              //var blob = URL.createObjectURL(file);
              //_compress(blob, file, basePath);
              var image = new Image();
              image.src = e.target.result;
              image.onload = function() {
                var expectWidth = this.naturalWidth;
                var expectHeight = this.naturalHeight;

                /*            if (this.naturalWidth > this.naturalHeight && this.naturalWidth > 800) {
                 expectWidth = 800;
                 expectHeight = expectWidth * this.naturalHeight / this.naturalWidth;
                 } else if (this.naturalHeight > this.naturalWidth && this.naturalHeight > 1200) {
                 expectHeight = 1200;
                 expectWidth = expectHeight * this.naturalWidth / this.naturalHeight;
                 }*/
                var canvas = document.createElement("canvas");
                var ctx = canvas.getContext("2d");
                canvas.width = expectWidth;
                canvas.height = expectHeight;
                ctx.drawImage(this, 0, 0, expectWidth, expectHeight);
                var base64 = null;
                //修復(fù)ios
                if (navigator.userAgent.match(/iphone/i)) {
                  console.log('iphone');
//                  alert("蘋果");
                  //alert(expectWidth + ',' + expectHeight);
                  //如果方向角不為1鼠锈,都需要進行旋轉(zhuǎn) added by lzk
                  if(Orientation != "" && Orientation != 1){
//                    alert('旋轉(zhuǎn)處理');
                    switch(Orientation){
                      case 6://需要順時針(向左)90度旋轉(zhuǎn)
//                      alert('需要順時針(向左)90度旋轉(zhuǎn)');
                        self.rotateImg(this,'left',canvas);
                        break;
                      case 8://需要逆時針(向右)90度旋轉(zhuǎn)
//                      alert('需要順時針(向右)90度旋轉(zhuǎn)');
                        self.rotateImg(this,'right',canvas);
                        break;
                      case 3://需要180度旋轉(zhuǎn)
//                      alert('需要180度旋轉(zhuǎn)');
                        /*self.rotateImg(this,'right',canvas);//轉(zhuǎn)兩次
                        self.rotateImg(this,'right',canvas);*/
                        self.rotateImg(this,'turntwo',canvas);
                        break;
                    }
                  }

                  /*var mpImg = new MegaPixImage(image);
                   mpImg.render(canvas, {
                   maxWidth: 800,
                   maxHeight: 1200,
                   quality: 0.8,
                   orientation: 8
                   });*/
                  base64 = canvas.toDataURL("image/jpeg", 0.8);
                }/*else if (navigator.userAgent.match(/Android/i)) {// 修復(fù)android
                 //                var encoder = new JPEGEncoder();
                 //                base64 = encoder.encode(ctx.getImageData(0, 0, expectWidth, expectHeight), 80);
                 alert("安卓");
                 base64 = ctx.getImageData(0, 0, expectWidth, expectHeight);
                 }*/else{
                  //alert(Orientation);
//                  alert("其它");
                  if(Orientation != "" && Orientation != 1){
                    //alert('旋轉(zhuǎn)處理');
                    switch(Orientation){
                      case 6://需要順時針(向左)90度旋轉(zhuǎn)
//                      alert('需要順時針(向左)90度旋轉(zhuǎn)');
                        self.rotateImg(this,'left',canvas);
                        break;
                      case 8://需要逆時針(向右)90度旋轉(zhuǎn)
//                      alert('需要順時針(向右)90度旋轉(zhuǎn)');
                        self.rotateImg(this,'right',canvas);
                        break;
                      case 3://需要180度旋轉(zhuǎn)
//                      alert('需要180度旋轉(zhuǎn)');
                        /*self.rotateImg(this,'right',canvas);//轉(zhuǎn)兩次
                        self.rotateImg(this,'right',canvas);*/
                        self.rotateImg(this,'turntwo',canvas);
                        break;
                    }
                  }

                  base64 = canvas.toDataURL("image/jpeg", 0.8);
                }
                self.upPhoto(index,base64,areaId);//傳給后臺
//              $("#myImage").attr("src", base64);
              };
            };
            oReader.readAsDataURL(file);
          }
        }

step4通過畫布,對圖片進行旋轉(zhuǎn)處理:

      rotateImg:function(img, direction,canvas) {
        console.log("拉拉");
        //alert(img);
        //最小與最大旋轉(zhuǎn)方向星著,圖片旋轉(zhuǎn)4次后回到原方向
        var min_step = 0;
        var max_step = 3;
        //var img = document.getElementById(pid);
        if (img == null)return;
        //img的高度和寬度不能在img元素隱藏后獲取购笆,否則會出錯
        var height = img.height;
        var width = img.width;
        //var step = img.getAttribute('step');
        var step = 2;
        if (step == null) {
          step = min_step;
        }
        if (direction == 'right') {
          step++;
          //旋轉(zhuǎn)到原位置,即超過最大值
          step > max_step && (step = min_step);
        } else {
          step--;
          step < min_step && (step = max_step);
        }
        //img.setAttribute('step', step);
        /*var canvas = document.getElementById('pic_' + pid);
         if (canvas == null) {
         img.style.display = 'none';
         canvas = document.createElement('canvas');
         canvas.setAttribute('id', 'pic_' + pid);
         img.parentNode.appendChild(canvas);
         }  */
        //旋轉(zhuǎn)角度以弧度值為參數(shù)
        var degree = step * 90 * Math.PI / 180;
        var 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;
        }
      },

stpe5最后將生成的圖片轉(zhuǎn)換為base64格式虚循,通過ajax請求發(fā)送給后端同欠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末样傍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子铺遂,更是在濱河造成了極大的恐慌衫哥,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件襟锐,死亡現(xiàn)場離奇詭異撤逢,居然都是意外死亡,警方通過查閱死者的電腦和手機粮坞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門蚊荣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捞蚂,你說我怎么就攤上這事妇押。” “怎么了姓迅?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵敲霍,是天一觀的道長。 經(jīng)常有香客問我丁存,道長肩杈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任解寝,我火速辦了婚禮扩然,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘聋伦。我一直安慰自己夫偶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布觉增。 她就那樣靜靜地躺著兵拢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逾礁。 梳的紋絲不亂的頭發(fā)上说铃,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音嘹履,去河邊找鬼腻扇。 笑死,一個胖子當(dāng)著我的面吹牛砾嫉,可吹牛的內(nèi)容都是我干的幼苛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼焕刮,長吁一口氣:“原來是場噩夢啊……” “哼舶沿!你這毒婦竟也來了舌剂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤暑椰,失蹤者是張志新(化名)和其女友劉穎霍转,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體一汽,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡避消,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了召夹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岩喷。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖监憎,靈堂內(nèi)的尸體忽然破棺而出纱意,到底是詐尸還是另有隱情,我是刑警寧澤鲸阔,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布偷霉,位于F島的核電站,受9級特大地震影響褐筛,放射性物質(zhì)發(fā)生泄漏类少。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一渔扎、第九天 我趴在偏房一處隱蔽的房頂上張望硫狞。 院中可真熱鬧,春花似錦晃痴、人聲如沸残吩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泣侮。三九已至,卻和暖如春笤虫,著一層夾襖步出監(jiān)牢的瞬間旁瘫,已是汗流浹背祖凫。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工琼蚯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惠况。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓遭庶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親稠屠。 傳聞我的和親對象是個殘疾皇子峦睡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容