JavaScript如何處理移動(dòng)端拍攝圖片旋轉(zhuǎn)問題
本文實(shí)例為大家分享了js移動(dòng)端拍攝圖片旋轉(zhuǎn)的具體代碼,供大家參考,具體內(nèi)容如下
第一步:引入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對(duì)象,2 blob對(duì)象,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元素隱藏后獲取,否則會(huì)出錯(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對(duì)象,2 blob對(duì)象 */ 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對(duì)象 return new File([u8arr], filename, { type: mime }); } else { // 轉(zhuǎn)換成成blob對(duì)象 return new Blob([u8arr], { type: mime }); } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JavaScript圖片旋轉(zhuǎn)效果實(shí)現(xiàn)方法詳解
- JS實(shí)現(xiàn)圖片旋轉(zhuǎn)動(dòng)畫效果封裝與使用示例
- js實(shí)現(xiàn)圖片旋轉(zhuǎn) js滾動(dòng)鼠標(biāo)中間對(duì)圖片放大縮小
- jQuery圖片旋轉(zhuǎn)插件jQueryRotate.js用法實(shí)例(附demo下載)
- 圖片旋轉(zhuǎn)、鼠標(biāo)滾輪縮放、鏡像、切換圖片js代碼
- JS實(shí)現(xiàn)3D圖片旋轉(zhuǎn)展示效果代碼
- javascript結(jié)合canvas實(shí)現(xiàn)圖片旋轉(zhuǎn)效果
- js實(shí)現(xiàn)圖片旋轉(zhuǎn)的三種方法
- 純JS實(shí)現(xiàn)旋轉(zhuǎn)圖片3D展示效果
- Exif.js圖片旋轉(zhuǎn)修正的方法
相關(guān)文章
Javascript 顏色漸變效果的實(shí)現(xiàn)代碼
在搭建博主博客的時(shí)候,尋思著做一些效果,看到菜單,就想是不是可以做一下顏色的漸變,增加一點(diǎn)動(dòng)態(tài)的感覺。有個(gè)jquery的插件,效果相當(dāng)不錯(cuò),不過博主還是打算自立更生寫一下,看看能不能實(shí)現(xiàn)2013-10-10js面向?qū)ο笾R妱?chuàng)建對(duì)象的幾種方式(工廠模式、構(gòu)造函數(shù)模式、原型模式)
JS的語法非常靈活,簡(jiǎn)單的對(duì)象創(chuàng)建就有好幾種不同的方法。這些過于靈活的地方有時(shí)候確實(shí)很讓人迷惑,那么今天我們就來梳理一下JS中常用的創(chuàng)建對(duì)象的幾種方法吧2015-11-11js實(shí)現(xiàn)iGoogleDivDrag模塊拖動(dòng)層拖動(dòng)特效的方法
這篇文章主要介紹了js實(shí)現(xiàn)iGoogleDivDrag模塊拖動(dòng)層拖動(dòng)特效的方法,實(shí)例分析了javascript操作拖動(dòng)層的技巧,需要的朋友可以參考下2015-03-03fastclick插件導(dǎo)致日期(input[type="date"])控件無法被觸發(fā)該如何解決
這篇文章主要介紹了fastclick插件導(dǎo)致日期(input[type="date"])控件無法被觸發(fā)該如何解決,需要的朋友可以參考下2015-11-11javascript用戶注冊(cè)提示效果的簡(jiǎn)單實(shí)例
這個(gè)可以增加用戶驗(yàn)證,不用js alert來作提示,而是在右邊提示,現(xiàn)在很多網(wǎng)站都這樣做,有需要的朋友可以參考一下2013-08-08淺談js函數(shù)三種定義方式 & 四種調(diào)用方式 & 調(diào)用順序
下面小編就為大家?guī)硪黄獪\談js函數(shù)三種定義方式 & 四種調(diào)用方式 & 調(diào)用順序。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02