H5調(diào)用攝像頭拍照上傳

工作用到了,就在這里記錄一下

<template>

??<div>

????<h2?class="title-detail">圖片描述</h2>

????<input?type="hidden"?id="picIndex"?value="0"?/>

????<div?id="image-list"?class="row?image-list">

??????<!--?<input?id="upload_image"?type="file"?name="image"?accept="image/*"?/>?-->

????</div>拍照:

????<input?type="file"?id="upload"?accept="image/jpg"?@change="upload"?/>

????<ul>

??????<li?v-for="(item,index)?in?imgList"?:key="index">

????????<img

??????????:src="item"

??????????alt

??????????style="width:100px;height:100px;border:1px?solid?#ccc;display:?inline-block;"

????????/>

????????<div?class="delimg?el-icon-circle-close"?@click="delimg(index)"></div>

??????</li>

????</ul>

????<img?src="./../../assets/timg.png"?id="my-img"?/>

??</div>

</template>

<script>

import?$?from?"jquery";

import?Exif?from?"exif-js";

import?{?stringify?}?from?"querystring";

export?default?{

??data()?{

????return?{

??????headerImage:?"",

??????picValue:?"",

??????imgList:?[]

????};

??},

??created()?{},

??mounted()?{

????$(document).ready(function()?{

??????$("#my-img").click(function()?{

????????$("#upload").click();

??????});

????});

??},

??methods:?{

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

??????//去獲取拍照時的信息,解決拍出來的照片旋轉(zhuǎn)問題

??????Exif.getData(file,?function()?{

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

??????});

??????//?看支持不支持FileReader

??????if?(!file?||?!window.FileReader)?return;

??????if?(/^image/.test(file.type))?{

????????//?創(chuàng)建一個reader

????????let?reader?=?new?FileReader();

????????//?將圖片2將轉(zhuǎn)成?base64?格式

????????reader.readAsDataURL(file);

????????//?讀取成功后的回調(diào)

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

????????????if?(self.imgList.length?<?9)?{

??????????????self.imgList.push(self.headerImage);

??????????????console.log(self.imgList,?"list");

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

??????????????alert("上傳照片不得大于9張");

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


????????????self.postImg(self.picValue);

??????????};

??????????//?}

????????};

??????}

????},


????postImg(file)?{

??????//?這里寫接口

??????console.log(file,'file');

??????this.$apiFetch.update('web.oss.upload',{?file:file}).then((data)?=>?{

????????console.log(data,'adta')

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

????????console.log(err)

??????})

????},

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

??????//最小與最大旋轉(zhuǎn)方向,圖片旋轉(zhuǎn)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++;

????????//旋轉(zhuǎn)到原位置,即超過最大值

????????step?>?max_step?&&?(step?=?min_step);

??????}?else?{

????????step--;

????????step?<?min_step?&&?(step?=?max_step);

??????}

??????//旋轉(zhuǎn)角度以弧度值為參數(shù)

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

??????}

??????//修復(fù)ios上傳圖片的時候?被旋轉(zhuǎn)的問題

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

????????switch?(Orientation)?{

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

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

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

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

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

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

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

????????????this.rotateImg(img,?"right",?canvas);?//轉(zhuǎn)兩次

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

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

????????}

??????}

??????//進行最小壓縮

??????let?ndata?=?canvas.toDataURL("image/jpeg",?0.1);

??????console.log("壓縮前:"?+?initSize);

??????console.log("壓縮后:"?+?ndata.length);

??????console.log(

????????"壓縮率:"?+?~~((100?*?(initSize?-?ndata.length))?/?initSize)?+?"%"

??????);

??????tCanvas.width?=?tCanvas.height?=?canvas.width?=?canvas.height?=?0;

??????return?ndata;

????},

????delimg(index)?{

??????for?(let?i?=?0;?i?<?this.imgList.length;?i++)?{

????????if?(i?==?index)?{

??????????this.imgList.splice(index,?1);?//刪除第index個元素

????????}

??????}

??????console.log(this.imgList,?"imgList2del");

????}

??}

};

</script>

<style?lang="less"?scope>

*?{

??margin:?0;

??padding:?0;

}

#upload?{

??display:?none;

}

.show?{

??width:?100px;

??height:?100px;

??overflow:?hidden;

??position:?relative;

??border-radius:?50%;

??border:?1px?solid?#d5d5d5;

}

.picture?{

??width:?100%;

??height:?100%;

??overflow:?hidden;

??background-position:?center?center;

??background-repeat:?no-repeat;

??background-size:?cover;

}

ul?>?li?{

??width:?120px;

??padding:?5px;

??display:?inline-block;?

??position:?relative;

??.delimg?{

????width:?5px;

????height:?5px;

????position:?absolute;

????top:?0;

????right:?10px;

??}

}

#my-img?{

??width:?5rem;

}

</style>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末形病,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子霞幅,更是在濱河造成了極大的恐慌漠吻,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件司恳,死亡現(xiàn)場離奇詭異途乃,居然都是意外死亡,警方通過查閱死者的電腦和手機扔傅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門耍共,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猎塞,你說我怎么就攤上這事试读。” “怎么了荠耽?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵钩骇,是天一觀的道長。 經(jīng)常有香客問我铝量,道長伊履,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任款违,我火速辦了婚禮,結(jié)果婚禮上群凶,老公的妹妹穿的比我還像新娘插爹。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布赠尾。 她就那樣靜靜地躺著力穗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪气嫁。 梳的紋絲不亂的頭發(fā)上当窗,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音寸宵,去河邊找鬼崖面。 笑死,一個胖子當著我的面吹牛梯影,可吹牛的內(nèi)容都是我干的巫员。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼甲棍,長吁一口氣:“原來是場噩夢啊……” “哼简识!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起感猛,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤七扰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后陪白,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颈走,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年拷泽,在試婚紗的時候發(fā)現(xiàn)自己被綠了疫鹊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡司致,死狀恐怖拆吆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脂矫,我是刑警寧澤枣耀,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站庭再,受9級特大地震影響捞奕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拄轻,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一颅围、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恨搓,春花似錦院促、人聲如沸筏养。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渐溶。三九已至,卻和暖如春弄抬,著一層夾襖步出監(jiān)牢的瞬間茎辐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工掂恕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拖陆,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓竹海,卻偏偏與公主長得像慕蔚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斋配,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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