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

HTML:

<!--添加-->

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

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




JS:

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

????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手機(jī)上傳豎拍照片旋轉(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;

}

}

//進(jìn)行最小壓縮

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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容