ios手機豎屏拍照圖片旋轉90°問題解決方法
-
產生原因
手機拍照會給圖片新增一個Orientaion資訊(即拍照方向),如下:
![5205277-2b1c5469f0f75e3f.png](https://i.iter01.com/images/f7674d152a03ebcf96e203ffd261136cfb0f61bfae007f06c965422ffd66fad8.png)
此資訊依據於exif.js
1代表正常的拍攝角度,ios橫屏下拍攝、安卓機無論橫屏豎屏拍攝,Orientaion的值都為1;但是ios豎屏拍攝,Orientaion的值為6,即豎著拍出的照片被新增了一個順時針旋轉90°的拍照方向,顯示的時候其實就是橫著拍的照片順時針旋轉90°而成。當我們對拍出來的照片進行處理後,這個拍攝方向Orientaion資訊就會丟失,顯示的效果自然回到橫屏狀態,看起來像是逆時針旋轉了90°。
-
解決思路
獲取拍攝方向(圖片旋轉的角度) → 將圖片旋轉到正確的角度 → canvas繪製出正確角度的圖 → 使用(展示,上傳等)
-
程式碼實現
// 獲取圖片旋轉的角度
function getOrientation(file, callback) {
var reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function (e) {
var view = new DataView(e.target.result);
if (view.getUint16(0, false) != 0xFFD8) return callback(-2);
var length = view.byteLength,
offset = 2;
while (offset < length) {
var marker = view.getUint16(offset, false);
offset += 2;
if (marker == 0xFFE1) {
if (view.getUint32(offset += 2, false) != 0x45786966) return callback(-1);
var little = view.getUint16(offset += 6, false) == 0x4949;
offset += view.getUint32(offset + 4, little);
var tags = view.getUint16(offset, little);
offset += 2;
for (var i = 0; i < tags; i++)
if (view.getUint16(offset + (i * 12), little) == 0x0112)
return callback(view.getUint16(offset + (i * 12) + 8, little));
} else if ((marker & 0xFF00) != 0xFF00) break;
else offset += view.getUint16(offset, false);
}
return callback(-1);
};
}
// 將圖片旋轉到正確的角度
function resetOrientation(srcBase64, srcOrientation, callback) {
var img = new Image();
img.onload = function () {
var width = img.width,
height = img.height,
canvas = document.createElement('canvas'),
ctx = canvas.getContext("2d");
// set proper canvas dimensions before transform & export
if ([5, 6, 7, 8].indexOf(srcOrientation) > -1) {
canvas.width = height;
canvas.height = width;
} else {
canvas.width = width;
canvas.height = height;
}
// transform context before drawing image
switch (srcOrientation) {
case 2:
ctx.transform(-1, 0, 0, 1, width, 0);
break;
case 3:
ctx.transform(-1, 0, 0, -1, width, height);
break;
case 4:
ctx.transform(1, 0, 0, -1, 0, height);
break;
case 5:
ctx.transform(0, 1, 1, 0, 0, 0);
break;
case 6:
ctx.transform(0, 1, -1, 0, height, 0);
break;
case 7:
ctx.transform(0, -1, -1, 0, height, width);
break;
case 8:
ctx.transform(0, -1, 1, 0, 0, width);
break;
default:
ctx.transform(1, 0, 0, 1, 0, 0);
}
// draw image
ctx.drawImage(img, 0, 0);
// export base64
callback(canvas.toDataURL('image/jpeg'));
};
img.src = srcBase64;
};
//呼叫
getOrientation(file, function (orientation) {
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function (evt) {
var base64 = evt.target.result;
// 將圖片旋轉到正確的角度
resetOrientation(base64, orientation, function (src) {
//src是圖片旋轉到正確的角度後的base64資料的URL
//拿到src後繼續做相關操作
});
};
});
參考:
iOS手機豎著拍的照片經過前端處理之後被旋轉了90°的原因以及解決方案 --- by 任無名F
相關文章
- 手機上傳的圖片翻轉90度問題
- 用exfe.js和canvas解決移動端 IOS 拍照上傳圖片翻轉問題JSCanvasiOS
- 怎麼旋轉圖片?BenVista PhotoZoom Pro旋轉圖片的方法OOM
- Swift橫豎屏切換、自動旋轉螢幕、手動旋轉螢幕、鎖定當前螢幕禁止轉屏、橫豎屏頁面跳轉過度、橫豎屏UI適配SwiftUI
- canvas橫屏簽名,簽名圖片旋轉90度生成base64Canvas
- [iOS]終極橫豎屏切換解決方案iOS
- iOS螢幕旋轉解決方案iOS
- JavaScript實現手機拍攝圖片的旋轉、壓縮JavaScript
- IOS下圖片不能顯示問題的解決辦法iOS
- H5 和小程式拍照圖片旋轉、壓縮和上傳H5
- 旋轉圖片驗證
- 將圖片旋轉(這裡不是旋轉imageView)View
- 解決圖片訪問403 Forbidden問題ORB
- 解決js控制元素背景圖片切換時的閃屏問題JS
- nginx 解決圖片跨域問題Nginx跨域
- T113啟動G2D旋轉豎屏當作橫屏使用
- 透過 cavnas 旋轉圖片
- php實現圖片旋轉PHP
- js監聽手機橫豎屏事件JS事件
- 解決Hexo關於圖片的問題Hexo
- emiya-canvas.js 解決ios下拍照傾斜與canvas高清屏下繪圖模糊問題CanvasJSiOS繪圖
- 前端手勢控制圖片外掛書寫四(圖片上傳及Ios圖片方向問題)前端iOS
- 滑鼠懸浮圖片旋轉效果
- CSS3圖片旋轉效果CSSS3
- 在手機端使用拍照功能上傳圖片的功能的解決文案
- 【Go語言繪圖】圖片的旋轉Go繪圖
- 直播平臺搭建,Android手機拍照和手機相簿選取圖片的工具Android
- 手機APP測試之ADB常見問題解決方法APP
- 投屏成功後,手機橫屏切豎屏小窗畫面向右偏移
- 用SQL解決有向圖問題(轉)SQL
- js控制專輯圖片旋轉效果JS
- 記hexo寫作圖片與多機器協作問題解決Hexo
- Flutter 圖片裁剪旋轉翻轉編輯器Flutter
- 一行程式碼實現移動端拍照旋轉、壓縮問題行程
- 多行文字末尾新增圖片排版問題解決
- 成功解決github無法顯示圖片問題Github
- PDF轉圖片部分公式字元丟失問題解決的爬坑記錄公式字元
- 開源圖片工具箱(Img Toolbox) 格式轉換 新增水印 圖片壓縮 圖片裁剪 圖片旋轉 圖片縮放
- iOS 圖片壓縮方法iOS