拍照或從文件夾里上傳圖片(重復(fù)上傳同一張圖片失效的解決辦法)

HTML:

<!--添加-->

<div? class="dianji" @click="triggerUpload">添加圖片</div>

<input type="file" id="upload" accept="image/*;capture=camera" value="" @change="upload">




JS:

triggerUpload() { //觸發(fā)input的點擊事件闻书,用戶選擇圖片進行上傳

????document.getElementById("upload").click();

},


//上傳圖片

upload(e) {

let self = this;

let file = e.target.files[0] || e.dataTransfer.files[0];

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;

e.target.value='';//input file 重復(fù)上傳同一張圖片失效的解決辦法

let uploadImagesItem = {

msrc: this.result,

src: this.result,

Attachmentid: 0,

Newfilename: this.result

};

//現(xiàn)在是判斷圖片是否大于250k,是就直接上傳,反之壓縮圖片

if(this.result.length <= (250 * 1024)) {

self.uploadImages.push(uploadImagesItem);

self.postImg(this.result); //提交圖片到后臺

} else {

img.onload = function() {

uploadImagesItem = {

msrc: self.compress(img, Orientation),

src: self.compress(img, Orientation),

Attachmentid: 0,

Newfilename: self.compress(img, Orientation)

};

self.uploadImages.push(uploadImagesItem);

let data = self.compress(img, Orientation);

self.postImg(data);

}

}

}

}

},





postImg() {

//這里寫接口

},





//旋轉(zhuǎn)照片, 利用exif.js解決ios手機上傳豎拍照片旋轉(zhuǎn)90度問題

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;

},

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帘靡,一起剝皮案震驚了整個濱河市知给,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖涩赢,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戈次,死亡現(xiàn)場離奇詭異,居然都是意外死亡筒扒,警方通過查閱死者的電腦和手機怯邪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來花墩,“玉大人悬秉,你說我怎么就攤上這事”ⅲ” “怎么了和泌?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祠肥。 經(jīng)常有香客問我武氓,道長,這世上最難降的妖魔是什么搪柑? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任聋丝,我火速辦了婚禮,結(jié)果婚禮上工碾,老公的妹妹穿的比我還像新娘弱睦。我一直安慰自己,他們只是感情好渊额,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布况木。 她就那樣靜靜地躺著,像睡著了一般旬迹。 火紅的嫁衣襯著肌膚如雪火惊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天奔垦,我揣著相機與錄音屹耐,去河邊找鬼。 笑死椿猎,一個胖子當著我的面吹牛惶岭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播犯眠,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼按灶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了筐咧?” 一聲冷哼從身側(cè)響起鸯旁,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤噪矛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铺罢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艇挨,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年畏铆,在試婚紗的時候發(fā)現(xiàn)自己被綠了雷袋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡辞居,死狀恐怖楷怒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓦灶,我是刑警寧澤鸠删,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贼陶,受9級特大地震影響刃泡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碉怔,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一烘贴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撮胧,春花似錦桨踪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至墓怀,卻和暖如春汽纠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背傀履。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工虱朵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钓账。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓碴犬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親官扣。 傳聞我的和親對象是個殘疾皇子翅敌,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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

  • 移動端ios圖片處理的思路羞福,是先用exif.js獲取到旋轉(zhuǎn)的角度惕蹄,然后把圖片進行壓縮處理,最后再旋轉(zhuǎn)圖片 為什么要...
    賣萌可愛啊閱讀 1,572評論 0 1
  • 上網(wǎng)搜索了angularjs裁剪,發(fā)現(xiàn)只有正方形和圓形 http://www.cnblogs.com/smilec...
    四腳蛇閱讀 733評論 0 1
  • 一:canvas簡介 1.1什么是canvas卖陵? ①:canvas是HTML5提供的一種新標簽 ②:HTML5 ...
    GreenHand1閱讀 4,685評論 2 32
  • 源站:http://fengyuanchen.github.io/viewer/ 應(yīng)用: html: 源碼上是正常...
    羊繪霖閱讀 5,497評論 0 2
  • 昨晚看了G20西湖晚會遭顶,西湖真的好美好漂亮,看了中央電視臺直播后泪蔫,微信朋友圈都刷屏了棒旗,真為杭州,為中國感到驕傲...
    晴冰閱讀 202評論 0 0