需求很簡單:h5拍照上傳照片,然後顯示出來
問題在:上傳之後的圖片在PC,IOS端均能正常顯示,Android端顯示的則是被旋轉90度的。
直接上代碼
下面這個方法傳入file對象,然後會去除掉照片中的exIf信息,之後返回。用這個方法,就可以保證PC,IOS,Android端都顯示正常的圖片。
function removePicExif(file) {
return new Promise((reslove) => {
if (file) {
let reader = new FileReader();
let image = new Image();
reader.onload = function (ev) {
image.src = ev.target.result;
image.onload = function () {
const ctxWidth = this.width;
const ctxHeight = this.height;
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
canvas.width = ctxWidth;
canvas.height = ctxHeight;
ctx.drawImage(this, 0, 0, ctxWidth, ctxHeight);
canvas.toBlob((blob) => {
const newFile = new File([blob], file.name, {
type: "image/jpeg",
lastModified: Date.now(),
});
reslove(newFile)
});
};
};
reader.readAsDataURL(file);
}
})
}
下面我來説下我的研究
發現在手機垂直拍攝上傳的圖片會在Android中被旋轉後,查了很多資料,大同小異,就是獲取到圖片的EXIF信息,然後利用canvas旋轉到正確的方向。
但是,但是實際測試中,我發現並不需要利用canvas再做旋轉。
大家可以拿出手機來拍攝一下,在垂直豎拍情況下,拍攝的圖片正常。在垂直橫拍的情況下,其實拍攝的圖片也是和垂直豎拍的方向一樣的。
在垂直的情況下,你無論橫排,豎拍,倒着拍,拍出來的圖片,方向都是以豎拍方向來的,並不會因為你是倒着拿手機,手機拍出來的照片就是倒的
這是垂直豎拍
這是垂直橫拍
垂直情況下,你怎麼拿手機,拍出來的方向都是一個
所以,其實手機端在拍攝的時候已經幫我們旋轉到了合適的方向,不需要我們再進行旋轉了。但是,照片信息依然保留了該照片的拍攝方向,所以,在Android上,Android再一次根據拍攝方向自動做了旋轉,結果就是轉過了,導致Android的圖片顯示不對。
所以,我們要做的,僅僅應該是取消EXIF信息,而不是旋轉。
小彩蛋,到這其實基本就結束了,但是,水平情況下呢,手機拍照又是什麼情況呢
當你手機和地面平行,拍攝地面,你會發現,拍出來的照片就是最初的樣子,橫着拍,照片就是橫的,豎着拍。照片就是豎的,手機這是沒有做處理,你覺得是為什麼呢