JavaScript如何處理移動端拍攝圖片旋轉(zhuǎn)問題
更新時間:2019年11月16日 15:21:10 作者:隨遇而安、1314
這篇文章主要告訴大家JavaScript如何處理移動端拍攝圖片旋轉(zhuǎn)問題,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了js移動端拍攝圖片旋轉(zhuǎn)的具體代碼,供大家參考,具體內(nèi)容如下
第一步:引入exif-js
<script src="https://cdn.jsdelivr.net/npm/exif-js@2.3.0/exif.min.js"></script>
第二步:
/**
* 處理圖片文件(處理移動端拍攝圖片旋轉(zhuǎn)問題)
* fileObj.file 圖片文件獨享
* fileObj.resolution 在指定圖片格式為 image/jpeg 或 image/webp的情況下,可以從 0 到 1 的區(qū)間內(nèi)選擇圖片的質(zhì)量。
* fileObj.fileType 輸入的文件類型,1 file對象,2 blob對象,3 base64字符串
* fileObj.fileName 輸出的文件名稱,默認為picture.jpeg
* fileObj.callback 回調(diào)函數(shù)
*/
function handleImageFile(fileObj) {
// 給參數(shù)附初始值
fileObj.fileName = fileObj.hasOwnProperty("fileName") ? "images/" + fileObj.fileName : "images/picture.jpeg";
// 獲取文件類型
var fType = fileObj.file.type;
if (fType.indexOf("image") === -1) return fileObj.callback({
status: 500,
message: "文件類型不正確",
data: null
});
if (!EXIF) return fileObj.callback({
status: 500,
message: "EXIF 不存在",
data: null
});
if (fileObj.file) {
// 獲取照片方向角屬性,用戶旋轉(zhuǎn)控制
EXIF.getData(fileObj.file, function () {
var orientation = EXIF.getTag(this, 'Orientation');
var oReader = new FileReader();
oReader.onload = function (e) {
var image = new Image();
image.src = e.target.result;
image.onload = function () {
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
var resultFile = null;
var ua = navigator.userAgent;
canvas.width = this.naturalWidth;
canvas.height = this.naturalHeight;
ctx.drawImage(this, 0, 0, this.naturalWidth, this.naturalHeight);
// android終端
var isAdr = ua.indexOf("Android") > -1 || ua.indexOf("Adr") > -1;
// ios終端
var isIOS = ua.indexOf("iPhone") > -1 || ua.indexOf("iOS") > -1;
// 修復ios 或 Android
if (isIOS || isAdr) {
// 如果方向角不為1,都需要進行旋轉(zhuǎn)
if (orientation && orientation !== "" && orientation !== 1) {
switch (orientation) {
case 6: // 需要順時針(向左)90度旋轉(zhuǎn)
rotateImg(this, "left", canvas);
break;
case 8: // 需要逆時針(向右)90度旋轉(zhuǎn)
rotateImg(this, "right90", canvas);
break;
case 3: // 需要180度旋轉(zhuǎn),轉(zhuǎn)兩次
rotateImg(this, "right180", canvas);
break;
}
}
resultFile = canvas.toDataURL("image/jpeg", fileObj.resolution);
} else {
resultFile = canvas.toDataURL("image/jpeg", fileObj.resolution);
}
switch (fileObj.fileType) {
case 1:
case 2:
fileObj.callback({
status: 200,
message: "success",
data: dataURLtoFile(resultFile, fileObj.fileType, fileObj.fileName)
});
break;
case 3:
fileObj.callback({
status: 200,
message: "success",
data: resultFile
});
break;
default:
break;
}
};
};
oReader.readAsDataURL(fileObj.file);
});
} else {
return fileObj.callback({
status: 500,
message: "文件不存在",
data: null
});
}
/**
* 旋轉(zhuǎn)圖片
*/
function rotateImg(img, direction, canvas) {
if (img === null) return;
// 最小與最大旋轉(zhuǎn)方向,圖片旋轉(zhuǎn)4次后回到原方向
var minStep = 0;
var maxStep = 3;
// img的高度和寬度不能在img元素隱藏后獲取,否則會出錯
var width = img.width;
var height = img.height;
var step = 2;
if (step === null) step = minStep;
if (direction === "right90") {
step++;
step > maxStep && (step = minStep);
} else if(direction === "right180") {
step = 2;
} else {
step--;
step < minStep && (step = maxStep);
}
// 旋轉(zhuǎn)角度以弧度值為參數(shù)
var degree = step * 90 * Math.PI / 180;
var ctx = canvas.getContext("2d");
switch (step) {
case 0:
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0, width, height);
break;
case 1:
canvas.width = height;
canvas.height = width;
ctx.rotate(degree);
ctx.drawImage(img, 0, -height, width, height);
break;
case 2:
canvas.width = width;
canvas.height = height;
ctx.rotate(degree);
ctx.drawImage(img, -width, -height, width, height);
break;
case 3:
canvas.width = height;
canvas.height = width;
ctx.rotate(degree);
ctx.drawImage(img, -width, 0, width, height);
break;
}
}
/**
* type:1 file對象,2 blob對象
*/
function dataURLtoFile(dataurl, type, filename) {
var arr = dataurl.split(',');
var mime = arr[0].match(/:(.*?);/)[1];
var bstr = atob(arr[1]);
var n = bstr.length;
var u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
if (type === 1) { // 轉(zhuǎn)換成file對象
return new File([u8arr], filename, {
type: mime
});
} else { // 轉(zhuǎn)換成成blob對象
return new Blob([u8arr], {
type: mime
});
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- JavaScript圖片旋轉(zhuǎn)效果實現(xiàn)方法詳解
- JS實現(xiàn)圖片旋轉(zhuǎn)動畫效果封裝與使用示例
- js實現(xiàn)圖片旋轉(zhuǎn) js滾動鼠標中間對圖片放大縮小
- jQuery圖片旋轉(zhuǎn)插件jQueryRotate.js用法實例(附demo下載)
- 圖片旋轉(zhuǎn)、鼠標滾輪縮放、鏡像、切換圖片js代碼
- JS實現(xiàn)3D圖片旋轉(zhuǎn)展示效果代碼
- javascript結(jié)合canvas實現(xiàn)圖片旋轉(zhuǎn)效果
- js實現(xiàn)圖片旋轉(zhuǎn)的三種方法
- 純JS實現(xiàn)旋轉(zhuǎn)圖片3D展示效果
- Exif.js圖片旋轉(zhuǎn)修正的方法
相關(guān)文章
JavaScript實現(xiàn)函數(shù)緩存及應(yīng)用場景
在JavaScript中,可以通過函數(shù)緩存來提高函數(shù)的執(zhí)行效率,本文就來介紹一下JavaScript實現(xiàn)函數(shù)緩存及應(yīng)用場景,具有一定的參考價值,感興趣的可以了解一下2024-01-01
javascript實現(xiàn)的鼠標鏈接提示效果生成器代碼
javascript實現(xiàn)的鼠標鏈接提示效果生成器代碼...2007-06-06
JavaScript清除所有(多個)定時器的方法實戰(zhàn)案例
定時器就是由JS提供了一些原生方法來實現(xiàn)延時去執(zhí)行某一段代碼,下面這篇文章主要給大家介紹了關(guān)于JavaScript清除所有(多個)定時器的方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-01-01

