上篇文章【Js利用Canvas實現(xiàn)圖片壓縮功能】中做了圖片壓縮上傳,但是在IOS真機測試的時候,發(fā)現(xiàn)圖片預(yù)覽的時候自動逆時針旋轉(zhuǎn)了90度。對于這個bug,我完全不知道問題出在哪里,接下來就是面向百度編程了。通過度娘找到了相關(guān)資料,解決方法記錄在此。這個問題的具體因素其實我還是不清楚是為何導(dǎo)致的,只有IOS和部分三星手機會出現(xiàn)此bug。 絕大部分的安卓機并無此問題。
解決此問題需要引入一個第三方 JS 庫: exif.js 下載地址:https://github.com/exif-js/exif-js 通過exif.js 我們可以獲取到圖片的元信息,這其中就包括照片的拍照方向。
而 exif.js 給出的照片方向?qū)傩匀缦聢D:
IOS中通過 exif.js ,獲取拍照的圖片的方向,返回的值為 6, 也就是上圖最左邊的 F 的情況。 這也正是我們的bug所在。 因此我們通過判斷方向的值來做相應(yīng)的處理,如果值為 6 ,則我們對圖片進行旋轉(zhuǎn)矯正。
具體代碼如下:
//獲取圖片方向 function getPhotoOrientation(img) { var orient; EXIF.getData(img, function () { orient = EXIF.getTag(this, 'Orientation'); }); return orient; }
接下來我們將上篇文章中的壓縮函數(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ǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com