問題產生的原因:
iOS上拍攝/儲存的圖片會附帶屬性orientation(方向角)。orientation為6時,圖片會被旋轉。
可使用 exif.js 插件獲取圖片角度值,再利用 megapix-image.js 插件修復被旋轉的角度。
以下是從項目中復制過來的一些代碼,可進行參考
<input id="face" type="file" accept="image/*"> <label for="face"> <img id="faceImg"/> </label>
$("#face").change(function () { toBase64(this, '#faceImg', function(url) { //url:壓縮/旋轉處理后的base64圖片 }) })
1 //本地圖片轉base64 2 function toBase64(eleInput, eleImg, callback){ 3 var file = eleInput.files[0]; 4 var reader = new FileReader(); 5 reader.onloadend = function (e) { 6 $(eleImg).attr("style", "display:inline-block"); 7 $(eleImg).attr("src", e.target.result); 8 dealImage(reader.result, 500, file, function(base64) { 9 callback(base64) 10 }) 11 } 12 if (file) { 13 reader.readAsDataURL(file); 14 } 15 }
//base64圖片壓縮 function dealImage(base64, w, file, callback) { var newImage = new Image(); var quality = 0.6; //壓縮系數0-1之間 newImage.src = base64; newImage.setAttribute("crossOrigin", 'Anonymous'); //url為外域時需要 var imgWidth, imgHeight; newImage.onload = function () { imgWidth = this.width; imgHeight = this.height; var canvas = document.createElement("canvas"); var ctx = canvas.getContext("2d"); if (Math.max(imgWidth, imgHeight) > w) { if (imgWidth > imgHeight) { canvas.width = w; canvas.height = w * imgHeight / imgWidth; } else { canvas.height = w; canvas.width = w * imgWidth / imgHeight; } } else { canvas.width = imgWidth; canvas.height = imgHeight; quality = 0.6; } ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.drawImage(this, 0, 0, canvas.width, canvas.height); var base64 = canvas.toDataURL("image/jpeg", quality); //壓縮語句 // 如想確保圖片壓縮到自己想要的尺寸,如要求在50-150kb之間,請加以下語句,quality初始值根據情況自定 // while (base64.length / 1024 > 150) { // quality -= 0.01; // base64 = canvas.toDataURL("image/jpeg", quality); // } // 防止最后一次壓縮低於最低尺寸,只要quality遞減合理,無需考慮 // while (base64.length / 1024 < 50) { // quality += 0.001; // base64 = canvas.toDataURL("image/jpeg", quality); // } //iphone需要對圖片進行角度判斷后旋轉圖片,保證圖片正向 if(navigator.userAgent.match(/iphone/i)) { var myorientation = 0; EXIF.getData(file, function() { //圖片方向角 var Orientation = null; EXIF.getAllTags(this); //獲取方向角值 myorientation = EXIF.getTag(this, 'Orientation'); var mpImg = new MegaPixImage(newImage); mpImg.render(canvas, { maxWidth: 500, maxHeight: 700, quality: quality || 0.8, orientation: myorientation }); base64 = canvas.toDataURL(file.type, quality || 0.8); callback(base64) }); return } // 修復android // if(navigator.userAgent.match(/Android/i)) { // var encoder = new JPEGEncoder(); // base64 = encoder.encode(ctx.getImageData(0, 0, w, h), quality * 100 || 80); // } callback(base64);//必須通過回調函數返回,否則無法及時拿到該值 } }