移動端H5上傳圖片等比例壓縮及部分iOS手機(jī)圖片旋轉(zhuǎn)90度解決方案

注:1.此方法將上傳的圖片等比例壓縮或放大至500kb左右。

? ? ? ? 2.上傳非正照,如人臉照片,強(qiáng)制旋轉(zhuǎn)為正照冈欢。

? ? ? ? 3.iOS 13.3.1以上版本手機(jī)拍出來的照片,視覺上是正照盈简,實際順時針旋轉(zhuǎn)了90度凑耻,通過判斷版本號,強(qiáng)制逆時針旋轉(zhuǎn)90度回正后再上傳柠贤。

1.在公共js香浩,如common.js里封裝:

/*圖片旋轉(zhuǎn)處理*/

export?function?rotateImg(img,?direction,?canvas)?{

????var?min_step?=?0;

????var?max_step?=?3;

????if?(img?==?null)?return;

????var?height?=?img.height;

????var?width?=?img.width;

????var?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);

? ? ?}

????var?degree?=?step?*?90?*?Math.PI?/?180;

????var?ctx?=?canvas.getContext('2d');

? ??//解決iOS版本13.3.1以上圖片旋轉(zhuǎn)問題

????var?str=?navigator.userAgent.toLowerCase();?

????var?ver=str.match(/cpu?iphone?os?(.*?)?like?mac?os/);???

????if((ver?&&?ver[1].replace(/_/g,".").slice(0,2)==13?&&?ver[1].replace(/_/g,".").slice(3,4)>3)?||?(????ver?&&?ver[1].replace(/_/g,".").slice(0,2)>=14)?){? ?

? ? ? ????step?=?0;????

????? }

????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;

????}

}

/*base64轉(zhuǎn)blob*/

? export function dataURLtoBlob(dataurl) {

? ? ? 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 Blob([u8arr], {

? ? ? ? ? type: mime

? ? ? });

? }

2.組件中使用:

<template>

????<input type="file"?accept="image/*"? @change="uploadImg($event)">

??</template>

import?{?rotateImg,?dataURLtoBlob?}?from?"@/utils/common";

methods:?{

??????uploadImg(e)?{? ??

????????if?(!e.target.files.length)?{

??????????return

????????}

????????if?(e.target.files[0].type.indexOf('image')?<?0)?{

??????????Toast({

????????????message:?'請選擇圖片上傳',

????????????duration:?1500

??????????});

??????????return

????????}

????????let?img?=?new?Image();

????????let?_this?=?this;

????????_this.Orientation?=?'';

????????Exif.getData(e.target.files[0],?function?()?{

????????????_this.Orientation?=?Exif.getTag(this,?"Orientation");

????????});

????????let?canvas?=?document.createElement('canvas');

????????let?cxt?=?canvas.getContext('2d');

????????let?windowURL?=?window.URL?||?window.webkitURL;

????????img.src?=?windowURL.createObjectURL(e.target.files[0]);

????????_this.uploading?=?true;

? ??????//圖片縮放

????????img.onload?=?function?()?{

??????????let?width?=?1000;

??????????let?height?=?img.naturalHeight?/?(img.naturalWidth?/?1000);

??????????if?(img.naturalWidth?>?img.naturalHeight)?{

????????????width?=?img.naturalWidth?/?(img.naturalHeight?/?1000);

????????????height?=?1000;

??????????}?else?{

????????????width?=?1000;

????????????height?=?img.naturalHeight?/?(img.naturalWidth?/?1000);

??????????}

??????????canvas.width?=?width;

??????????canvas.height?=?height;

??????????cxt.drawImage(this,?0,?0,?width,?height);

? ? ? ? ? //圖片旋轉(zhuǎn)

??????????if?(_this.Orientation?!=?""?&&?_this.Orientation?!=?1)?{

??????????????switch?(_this.Orientation)?{

??????????????????case?6:?//需要順時針(向左)90度旋轉(zhuǎn)

??????????????????????_this.rotateImg(this,?"left",?canvas);

??????????????????????break;

??????????????????case?8:?//需要逆時針(向右)90度旋轉(zhuǎn)

??????????????????????_this.rotateImg(this,?"right",?canvas);

??????????????????????break;

??????????????????case?3:?//需要180度旋轉(zhuǎn)

??????????????????????_this.rotateImg(this,?"right2",?canvas);

??????????????????????break;

??????????????}

??????????}

??????????_this.Orientation?=?''

? ? ? ? ?//生成圖片

??????????_this.PhotoBase64?=?canvas.toDataURL('image/jpeg');?//轉(zhuǎn)base64

??????????let?fileObj?=?_this.dataURLtoBlob(_this.PhotoBase64);?//把壓縮的base64轉(zhuǎn)化為對象

? ????????let?formData?=?new?FormData();

? ? ? ? ? formData.append('file',?fileObj);

??????????uploadImage(formData).then(res?=>?{

? ??????????_this.uploading?=?false;

????????????Toast({

??????????????message:?'上傳成功',

??????????????duration:?1500

????????????});

??????????}).catch(e?=>?{

????????????_this.uploading?=?false;

????????????Toast({

??????????????message:?'上傳失敗',

??????????????duration:?1500

????????????});

??????????})

????????}

??????},

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者臼勉。
  • 序言:七十年代末邻吭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宴霸,更是在濱河造成了極大的恐慌囱晴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓢谢,死亡現(xiàn)場離奇詭異速缆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)恩闻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剧董,“玉大人幢尚,你說我怎么就攤上這事〕崧ィ” “怎么了尉剩?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長毅臊。 經(jīng)常有香客問我理茎,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任皂林,我火速辦了婚禮朗鸠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘础倍。我一直安慰自己烛占,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布沟启。 她就那樣靜靜地躺著忆家,像睡著了一般。 火紅的嫁衣襯著肌膚如雪德迹。 梳的紋絲不亂的頭發(fā)上芽卿,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音胳搞,去河邊找鬼卸例。 笑死,一個胖子當(dāng)著我的面吹牛流酬,可吹牛的內(nèi)容都是我干的币厕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼芽腾,長吁一口氣:“原來是場噩夢啊……” “哼旦装!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起摊滔,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤阴绢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后艰躺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呻袭,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年腺兴,在試婚紗的時候發(fā)現(xiàn)自己被綠了左电。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡页响,死狀恐怖篓足,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闰蚕,我是刑警寧澤栈拖,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站没陡,受9級特大地震影響涩哟,放射性物質(zhì)發(fā)生泄漏索赏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一贴彼、第九天 我趴在偏房一處隱蔽的房頂上張望潜腻。 院中可真熱鬧,春花似錦锻弓、人聲如沸砾赔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暴心。三九已至,卻和暖如春杂拨,著一層夾襖步出監(jiān)牢的瞬間专普,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工弹沽, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留檀夹,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓策橘,卻偏偏與公主長得像炸渡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子丽已,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348