摘要:有些時候在端上傳圖片會遇到這種情況,正向的圖片,上傳預覽時就被旋轉了。在使用或者其他軟件旋轉圖片時,圖片旋轉了,但不會改變,由于我們使用的圖片預覽器能夠預處理圖片,使其看起來與旋轉后一致,但上傳圖片時,瀏覽器并不會預處理。
有些時候在web端上傳圖片會遇到這種情況,正向的圖片,上傳預覽時就被旋轉了。
發(fā)生這種情況是因為,照片中包含很多屬性來記錄拍攝信息。
想要讀取這些屬性,需要引入EXIF(可在npm上搜索exif-js下載)
EXIF中,包含一個Orientation參數,用來記錄拍攝照片時的方向。在使用PS或者其他軟件旋轉圖片時,圖片旋轉了,但Orientation不會改變,由于我們使用的圖片預覽器能夠預處理圖片,使其看起來與旋轉后一致,但上傳圖片時,瀏覽器并不會預處理。所以導致圖片旋轉。
要解決這個問題,必須理解Orientation的含義,它一共含有8個值,分別是:1、2、3、4、5、6、7、8。
這8個值對應的意思是:
Orientation | 釋義 |
---|---|
1 | 正常 |
2 | 正常鏡像 |
3 | 順時針旋轉180° |
4 | 順時針旋轉180°鏡像 |
5 | 順時針旋轉270°鏡像 |
6 | 順時針旋轉270° |
7 | 順時針旋轉90°鏡像 |
8 | 順時針旋轉90° |
網上有一張圖片,可以比較直觀的看清對應關系。
代碼層面,引入exif-js后,可獲取到照片的Orientation值。
再根據Orientation來判斷如何旋轉照片。
以下是示例
EXIF.getData(file, function () { var Orientation = EXIF.getTag(this, "Orientation"); console.log("Orientation>>>>>>", Orientation); //轉換成base64 const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = e => { if (Orientation == 1) { console.log("圖片無需處理"); } else { var uploadBase64 = new Image(); uploadBase64.src = e.target.result; uploadBase64.onload = function () { //修正旋轉圖片 var expectWidth = uploadBase64.width; var expectHeight = uploadBase64.height; var canvas = document.createElement("canvas"), ctx = canvas.getContext("2d"); canvas.width = expectWidth; canvas.height = expectHeight; ctx.drawImage(uploadBase64, 0, 0, expectWidth, expectHeight); var base64 = null; if (Orientation !== "" && Orientation != 1) { switch (Orientation) { case 6: console.log("順時針旋轉270度"); rotateImg(uploadBase64, "left", canvas); break; case 8: console.log("順時針旋轉90度"); rotateImg(uploadBase64, "right", canvas); break; case 3: console.log("順時針旋轉180度"); rotateImg(uploadBase64, "horizen", canvas); break; } //輸出轉換后的base64圖片 var base64 = canvas.toDataURL(file.type, 1); //輸出轉換后的流 var newBlob = _this.convertBase64UrlToBlob(base64, file.type); } }; } }; }) //對圖片旋轉處理 rotateImg(img, direction, canvas) { console.log("開始旋轉圖片"); //圖片旋轉4次后回到原方向 if (img == null) return; var height = img.height; var width = img.width; var step = 2; if (direction == "right") { step++; } else if (direction == "left") { step--; } else if (direction == "horizen") { step = 2; //不處理 } //旋轉角度以弧度值為參數 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); break; case 1: canvas.width = height; canvas.height = width; ctx.rotate(degree); ctx.drawImage(img, 0, -height); break; case 2: canvas.width = width; canvas.height = height; ctx.rotate(degree); ctx.drawImage(img, -width, -height); break; case 3: canvas.width = height; canvas.height = width; ctx.rotate(degree); ctx.drawImage(img, -width, 0); break; } console.log("結束旋轉圖片"); }
這樣就可以解決,web端上傳圖片時,圖片被旋轉的問題啦。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98021.html
摘要:原文還是在簡書上上傳本地圖片處理各種問題這是最近給公司寫一個項目,項目要求大概是這樣子上傳手機本地圖片,然后裁剪后加的需求能夠旋轉圖片,用于裁剪后面加的需求填寫各種文字,選擇顏色,之后把文字和個相關的圖片,水印到裁剪的圖片上,上傳服務器生成 原文還是在簡書上: html5 上傳本地圖片處理各種問題 這是最近給公司寫一個項目,項目要求大概是這樣子:1.上傳手機本地圖片,然后裁剪(后加的需...
摘要:原文還是在簡書上上傳本地圖片處理各種問題這是最近給公司寫一個項目,項目要求大概是這樣子上傳手機本地圖片,然后裁剪后加的需求能夠旋轉圖片,用于裁剪后面加的需求填寫各種文字,選擇顏色,之后把文字和個相關的圖片,水印到裁剪的圖片上,上傳服務器生成 原文還是在簡書上: html5 上傳本地圖片處理各種問題 這是最近給公司寫一個項目,項目要求大概是這樣子:1.上傳手機本地圖片,然后裁剪(后加的需...
摘要:上傳圖片順時針旋轉度問題使用獲取圖片當前拍攝角度修正后展示裁切位置不正確或需要減去的差值問題描述當目標元素的上級元素中有使用時,用如上的方法都會導致計算錯誤,這一在常用框架,類庫中都存在。應該是和在實現(xiàn)上的差異造成了。 bug1.ios 上傳圖片 順時針旋轉90度問題 solution1.使用exif.js獲取圖片當前拍攝角度 修正后展示 http://www.mamicode.com...
閱讀 1492·2021-11-24 11:16
閱讀 2697·2021-07-28 12:32
閱讀 2308·2019-08-30 11:22
閱讀 1445·2019-08-30 11:01
閱讀 604·2019-08-29 16:24
閱讀 3552·2019-08-29 12:52
閱讀 1632·2019-08-29 12:15
閱讀 1338·2019-08-29 11:18