您好,登錄后才能下訂單哦!
這篇文章主要介紹JavaScript處理移動(dòng)端拍攝圖片旋轉(zhuǎn)問題的方法,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
第一步:引入exif-js
<script src="https://cdn.jsdelivr.net/npm/exif-js@2.3.0/exif.min.js"></script>
第二步:
/** * 處理圖片文件(處理移動(dòng)端拍攝圖片旋轉(zhuǎn)問題) * fileObj.file 圖片文件獨(dú)享 * fileObj.resolution 在指定圖片格式為 image/jpeg 或 image/webp的情況下,可以從 0 到 1 的區(qū)間內(nèi)選擇圖片的質(zhì)量。 * fileObj.fileType 輸入的文件類型,1 file對象,2 blob對象,3 base64字符串 * fileObj.fileName 輸出的文件名稱,默認(rèn)為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; // 修復(fù)ios 或 Android if (isIOS || isAdr) { // 如果方向角不為1,都需要進(jìn)行旋轉(zhuǎn) if (orientation && orientation !== "" && orientation !== 1) { switch (orientation) { case 6: // 需要順時(shí)針(向左)90度旋轉(zhuǎn) rotateImg(this, "left", canvas); break; case 8: // 需要逆時(shí)針(向右)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元素隱藏后獲取,否則會出錯(cuò) 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 }); } } }
以上是“JavaScript處理移動(dòng)端拍攝圖片旋轉(zhuǎn)問題的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。