ios手機豎屏拍照圖片旋轉90°問題解決方法
-
產生原因
手機拍照會給圖片新增一個Orientaion資訊(即拍照方向),如下:
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
相關文章
- 解決android有的手機拍照後上傳圖片被旋轉的問題Android
- iOS 橫豎屏旋轉總結iOS
- 程式碼處理 iOS 的橫豎屏旋轉iOS
- iOS下html上傳圖片被旋轉問題iOSHTML
- 關於android中呼叫系統拍照,返回圖片是旋轉90度..Android
- 用exfe.js和canvas解決移動端 IOS 拍照上傳圖片翻轉問題JSCanvasiOS
- canvas橫屏簽名,簽名圖片旋轉90度生成base64Canvas
- 圖片操作系列 —(2)手勢旋轉圖片
- [iOS]終極橫豎屏切換解決方案iOS
- 怎麼旋轉圖片?BenVista PhotoZoom Pro旋轉圖片的方法OOM
- iOS橫豎屏iOS
- JavaScript實現手機拍攝圖片的旋轉、壓縮JavaScript
- IOS下圖片不能顯示問題的解決辦法iOS
- 解決js控制元素背景圖片切換時的閃屏問題JS
- iOS螢幕旋轉解決方案iOS
- js監聽手機橫豎屏事件JS事件
- H5 和小程式拍照圖片旋轉、壓縮和上傳H5
- nginx 解決圖片跨域問題Nginx跨域
- [貝聊科技] iOS 終極橫豎屏切換解決方案iOS
- html中圖片旋轉HTML
- dialog橫豎屏切換時消失的解決方法
- 將圖片旋轉(這裡不是旋轉imageView)View
- iOS 橫豎屏切換iOS
- 解決圖片訪問403 Forbidden問題ORB
- 移動端圖片上傳旋轉、壓縮的解決方案
- 解決Hexo關於圖片的問題Hexo
- 前端手勢控制圖片外掛書寫四(圖片上傳及Ios圖片方向問題)前端iOS
- iOS圖片,視訊上傳&視訊內容旋轉iOS
- php實現圖片旋轉PHP
- 投屏成功後,手機橫屏切豎屏小窗畫面向右偏移
- 在手機端使用拍照功能上傳圖片的功能的解決文案
- emiya-canvas.js 解決ios下拍照傾斜與canvas高清屏下繪圖模糊問題CanvasJSiOS繪圖
- 直播平臺搭建,Android手機拍照和手機相簿選取圖片的工具Android
- 記hexo寫作圖片與多機器協作問題解決Hexo
- CSS3圖片旋轉效果CSSS3
- jQuery圖片放大和旋轉效果jQuery
- 【PHP縮圖類】手機照片不能生成縮圖問題以及解決方案PHP
- 【Go語言繪圖】圖片的旋轉Go繪圖