JS解決IOS中拍照?qǐng)D片預(yù)覽旋轉(zhuǎn)90度BUG的問(wèn)題
上篇文章【Js利用Canvas實(shí)現(xiàn)圖片壓縮功能】中做了圖片壓縮上傳,但是在IOS真機(jī)測(cè)試的時(shí)候,發(fā)現(xiàn)圖片預(yù)覽的時(shí)候自動(dòng)逆時(shí)針旋轉(zhuǎn)了90度。對(duì)于這個(gè)bug,我完全不知道問(wèn)題出在哪里,接下來(lái)就是面向百度編程了。通過(guò)度娘找到了相關(guān)資料,解決方法記錄在此。這個(gè)問(wèn)題的具體因素其實(shí)我還是不清楚是為何導(dǎo)致的,只有IOS和部分三星手機(jī)會(huì)出現(xiàn)此bug。 絕大部分的安卓機(jī)并無(wú)此問(wèn)題。
解決此問(wèn)題需要引入一個(gè)第三方 JS 庫(kù): exif.js 下載地址:https://github.com/exif-js/exif-js 通過(guò)exif.js 我們可以獲取到圖片的元信息,這其中就包括照片的拍照方向。
而 exif.js 給出的照片方向?qū)傩匀缦聢D:
IOS中通過(guò) exif.js ,獲取拍照的圖片的方向,返回的值為 6, 也就是上圖最左邊的 F 的情況。 這也正是我們的bug所在。 因此我們通過(guò)判斷方向的值來(lái)做相應(yīng)的處理,如果值為 6 ,則我們對(duì)圖片進(jìn)行旋轉(zhuǎn)矯正。
具體代碼如下:
//獲取圖片方向 function getPhotoOrientation(img) { var orient; EXIF.getData(img, function () { orient = EXIF.getTag(this, 'Orientation'); }); return orient; }
接下來(lái)我們將上篇文章中的壓縮函數(shù)修改如下:
//圖片壓縮 function compress(img, width, height, ratio) { var canvas, ctx, img64, orient; //獲取圖片方向 orient = getPhotoOrientation(img); canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; ctx = canvas.getContext("2d"); //如果圖片方向等于6 ,則旋轉(zhuǎn)矯正,反之則不做處理 if (orient == 6) { ctx.save(); ctx.translate(width / 2, height / 2); ctx.rotate(90 * Math.PI / 180); ctx.drawImage(img, 0 - height / 2, 0 - width / 2, height, width); ctx.restore(); } else { ctx.drawImage(img, 0, 0, width, height); } img64 = canvas.toDataURL("image/jpeg", ratio); return img64; }
OK, 問(wèn)題解決!
以上這篇JS解決IOS中拍照?qǐng)D片預(yù)覽旋轉(zhuǎn)90度BUG的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- iOS框架AVFoundation實(shí)現(xiàn)相機(jī)拍照、錄制視頻
- iOS仿微信相機(jī)拍照、視頻錄制功能
- IOS UIImagePickerController從拍照、圖庫(kù)、相冊(cè)獲取圖片
- Android 實(shí)現(xiàn)IOS選擇拍照相冊(cè)底部彈出的實(shí)例
- ios利用 AFN 上傳相冊(cè)或者拍照?qǐng)D片
- iOS拍照后圖片自動(dòng)旋轉(zhuǎn)90度的完美解決方法
- 詳解利用exif.js解決ios手機(jī)上傳豎拍照片旋轉(zhuǎn)90度問(wèn)題
- iOS視頻錄制(或選擇)壓縮及上傳功能(整理)
- iOS自定義相機(jī)實(shí)現(xiàn)拍照、錄制視頻
相關(guān)文章
JScript實(shí)現(xiàn)表格的簡(jiǎn)單操作
這篇文章主要為大家詳細(xì)介紹了JScript實(shí)現(xiàn)簡(jiǎn)單的表格操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08用Javascript輕松制作一套簡(jiǎn)單的抽獎(jiǎng)系統(tǒng)
用Javascript輕松制作一套簡(jiǎn)單的抽獎(jiǎng)系統(tǒng)...2006-12-12js實(shí)現(xiàn)addClass,removeClass,hasClass的函數(shù)代碼
js實(shí)現(xiàn)addClass,removeClass,hasClass的函數(shù)代碼,需要的朋友可以參考下。2011-07-07新手快速學(xué)習(xí)JavaScript免費(fèi)教程資源匯總
這篇文章主要介紹了新手快速學(xué)習(xí)JavaScript免費(fèi)教程資源匯總,都是非常不錯(cuò)的學(xué)習(xí)站點(diǎn),有需要的小伙伴可以參考下。2015-06-06JavaScript實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車最全代碼解析(ES6面向?qū)ο?
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車最全代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09JavaScript30 一個(gè)月純 JS 挑戰(zhàn)中文指南(英文全集)
JavaScirpt30 是 Wes Bos 推出的一個(gè) 30 天挑戰(zhàn)。項(xiàng)目免費(fèi)提供了 30 個(gè)視頻教程、30 個(gè)挑戰(zhàn)的起始文檔和 30 個(gè)挑戰(zhàn)解決方案源代碼。目的是幫助人們用純 JavaScript 來(lái)寫東西,不借助框架和庫(kù),也不使用編譯器和引用2017-07-07JavaScript封閉函數(shù)及常用內(nèi)置對(duì)象示例
這篇文章主要介紹了JavaScript封閉函數(shù)及常用內(nèi)置對(duì)象,結(jié)合實(shí)例形式分析了JavaScript封閉函數(shù)及常用內(nèi)置對(duì)象的定義與簡(jiǎn)單使用相關(guān)操作技巧,需要的朋友可以參考下2019-05-05