移動端 h5 照片的處理

前一陣在公司用vue開發(fā)webapp霎俩,遇到一個用戶拍照或者調(diào)用手機相冊展示圖片袭厂,然后上傳服務(wù)器的需求剑刑,接觸前端僅半年的我走上了一路踩坑的道路媳纬,下面我來說說我遇到的那些坑!

各種坑匯總

  • 調(diào)取手機相冊
    iOS到?jīng)]什么問題施掏,安卓手機好坑啊钮惠,網(wǎng)上搜了很多辦法,要么就是有的手機不管用七芭,要么就是只能調(diào)相冊不能調(diào)相機素挽,要么就是只能調(diào)相機不能調(diào)相冊
  • 調(diào)取相冊拿到相片后渲染到界面上,iOS又出了問題狸驳,通過相機拍攝的圖片是旋轉(zhuǎn)過90度的毁菱,或者蘋果里面正常的圖片到了安卓機展示是旋轉(zhuǎn)90的,也有的圖片蘋果上正常在后臺是歪的锌历。身為一個iOS開發(fā)出身的我這就不理解了,經(jīng)過幾番查證峦筒,得出一個結(jié)論究西,蘋果的相機是歪的!
  • 圖片渲染過后瀏覽器會崩潰物喷,尤其是在微信卤材,不得不說,微信好坑啊峦失,什么東西到微信上就會出現(xiàn)各種問題扇丛!
  • 然后是圖片上傳的問題,一開始采用了文件上傳的形式尉辑,后來結(jié)果測試反饋帆精,很多安卓機不能上傳成功!說多了都是淚隧魄,不多說進正題卓练!

總結(jié)一下我的解決辦法,希望能對跟我一樣還是個小白的人有所幫助

調(diào)取手機相冊和相機

采用h5調(diào)取相冊 雖然是一句話從網(wǎng)頁調(diào)取购啄,但是如果想相冊襟企,相機都調(diào)的話 要這么寫 (我真的是查了好久)

<form id="uploadForm" enctype="multipart/form-data">
   <input class="upload-open-photo" accept="image/*" type="file" id="filechooser" v-on:change="btnUploadFile($event)"/>
</form>

圖片渲染

圖片渲染我采用了canvas ,利用了一個叫 exif.js的插件獲取一下手機拍攝的方向(也就是拍照時是豎著拿手機還是橫著狮含,)顽悼,然后判斷下設(shè)備曼振,對iOS設(shè)備的三個方向?qū)D片進行旋轉(zhuǎn),利用canvas畫到畫布上


btnUploadFile(e){
      //獲取圖片
      var  self = this;
      var filechooser = document.getElementById('filechooser');
      var previewer = document.getElementById('previewer');
      var that = e.target;
      var files = that.files;
      var file = files[0];
      //判斷拍攝方向蔚龙,
       EXIF.getData(file,function(){
            self.orientation=EXIF.getTag(this,'Orientation');
       });
      self.fileData = file;
       // 接受 jpeg, jpg, png 類型的圖片
       if (!/\/(?:jpeg|jpg|png)/i.test(file.type)){
             return;
      }
      var reader = new FileReader();
     reader.onload = function() {
          var result = this.result;
          var img =  new Image();
         //進行圖片的渲染
           img.onload = function() {
                //圖片旋轉(zhuǎn)壓縮處理后的base64
                var compressedDataUrl =self.compress(img,self.fileData.type);
               //渲染到img標簽上
                self.toPreviewer(compressedDataUrl);
               img = null;
           };
         img.src = result;
      };
      reader.readAsDataURL(self.fileData);
},

圖片渲染

圖片渲染時不但要把圖片旋轉(zhuǎn)冰评,還要進行壓縮,由于現(xiàn)在相機像素太高府蛇,高清圖片會導(dǎo)致瀏覽器崩潰集索,當然如果是做的微信開發(fā),只需要在微信瀏覽器中適配汇跨,那么可以參考微信jssdk中的調(diào)用相冊的方法务荆,這樣就不會有圖歪和崩潰的問題了。當然如果不是只做微信穷遂,我們還是要進行壓縮函匕,同樣是采用canvas
http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

//對圖片進行旋轉(zhuǎn),壓縮的方法蚪黑,最終返回base64  渲染給img標簽的src
compress(img, fileType) {
      var degree=0,drawWidth,drawHeight,width,height;
      drawWidth=img.width;
      drawHeight=img.height;
      //以下改變一下圖片大小
     var maxSide = Math.max(drawWidth, drawHeight);
     if (maxSide > 1024) {
           var minSide = Math.min(drawWidth, drawHeight);
            minSide = minSide / maxSide * 1024;
            maxSide = 1024;
           if (drawWidth > drawHeight) {
                drawWidth = maxSide;
                drawHeight = minSide;
            } else {
                drawWidth = minSide;
                drawHeight = maxSide;
            }
    }
    var canvas=document.createElement('canvas');
    canvas.width=width=drawWidth;
    canvas.height=height=drawHeight;
    var context=canvas.getContext('2d');
    //判斷圖片方向盅惜,重置canvas大小,確定旋轉(zhuǎn)角度忌穿,iphone默認的是home鍵在右方的橫屏拍攝方式
    if($.device.ios){
         switch(this.orientation){
              //iphone橫屏拍攝抒寂,此時home鍵在左側(cè)
             case 3:
                   degree=180;
                   drawWidth=-width;
                   drawHeight=-height;
                    break;
          //iphone豎屏拍攝按厘,此時home鍵在下方(正常拿手機的方向)
              case 6:
                    canvas.width=height;
                    canvas.height=width;
                    degree=90;
                    drawWidth=width;
                    drawHeight=-height;
                    break;
              //iphone豎屏拍攝氓侧,此時home鍵在上方
               case 8:
                      canvas.width=height;
                       canvas.height=width;
                       degree=270;
                       drawWidth=-width;
                       drawHeight=height;
                       break;
          }
     }
     //使用canvas旋轉(zhuǎn)校正
     context.rotate(degree*Math.PI/180);
     context.drawImage(img,0,0,drawWidth,drawHeight);
     // 壓縮0.5就是壓縮百分之50
     var base64data = canvas.toDataURL(fileType, 0.5);
     canvas = context = null;
     this.urlbase = base64data;
      return base64data;
},

最終拿到base64渲染給img標簽的src

toPreviewer(dataUrl) {
       previewer.src = dataUrl;
 },

圖片上傳

上面拿到了base64 后臺提供一個base64上傳圖片的接口序宦,base64有個好處是我們獲取到的base64 是進行旋轉(zhuǎn)壓縮后圖片的base64玷犹,這樣我們上傳服務(wù)器穗慕,或從別的地方展示這個圖片都是旋轉(zhuǎn)壓縮后的勺良,如果其他頁面要展示這張圖片铅檩,就省去了旋轉(zhuǎn)壓縮的過程守呜!其實我現(xiàn)在也不知道為什么通過傳文件方式傳圖片有的安卓機不行眠寿,不過改base64上傳方式成功后就業(yè)沒在糾結(jié)躬翁。

感覺踩了不少坑,歸根結(jié)底還是自己前端經(jīng)驗不足岸⒐啊盒发!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市狡逢,隨后出現(xiàn)的幾起案子迹辐,更是在濱河造成了極大的恐慌,老刑警劉巖甚侣,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件明吩,死亡現(xiàn)場離奇詭異,居然都是意外死亡殷费,警方通過查閱死者的電腦和手機印荔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門低葫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仍律,你說我怎么就攤上這事嘿悬。” “怎么了水泉?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵善涨,是天一觀的道長。 經(jīng)常有香客問我草则,道長钢拧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任炕横,我火速辦了婚禮源内,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘份殿。我一直安慰自己膜钓,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布卿嘲。 她就那樣靜靜地躺著颂斜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拾枣。 梳的紋絲不亂的頭發(fā)上焚鲜,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音放前,去河邊找鬼。 笑死糯彬,一個胖子當著我的面吹牛凭语,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撩扒,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼似扔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搓谆?” 一聲冷哼從身側(cè)響起炒辉,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泉手,沒想到半個月后黔寇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡斩萌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年缝裤,在試婚紗的時候發(fā)現(xiàn)自己被綠了屏轰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡憋飞,死狀恐怖霎苗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情榛做,我是刑警寧澤唁盏,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站检眯,受9級特大地震影響厘擂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜轰传,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一驴党、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧获茬,春花似錦港庄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至佩谣,卻和暖如春把还,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茸俭。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工吊履, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人调鬓。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓艇炎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腾窝。 傳聞我的和親對象是個殘疾皇子缀踪,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,164評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件虹脯、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評論 4 62
  • 01 每個人心中都有一個田園夢 “采菊東籬下循集,悠然見南山”唇敞。越來越多都市人向往“農(nóng)夫、山泉、有點田”的田園生活厚棵。 ...
    婉風(fēng)清逸閱讀 355評論 1 3
  • 早上是被鄰居家的鞭炮聲弄醒的蕉世,新家入住,迎來了也第三家鄰居婆硬,祝賀狠轻。感覺她們?nèi)诵U和善的,因為她盡然和我打招呼(其...
    羅懷宇205閱讀 139評論 0 0
  • 前言:##### 對于搞IOS開發(fā)的只要提起UITableView這個控件彬犯,我想沒人會說他不了解吧向楼,以為這個控件太...
    暗香有獨閱讀 421評論 0 0