IOS 拍照上傳base64圖片,豎屏照片旋轉問題


問題產生的原因:

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);//必須通過回調函數返回,否則無法及時拿到該值
    }
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM