您好,欢迎访问木子天禾科技官网!
17319297980
15934152105
北京软件开发公司_山西软件开发公司_木子天禾科技官网
联系我们

北京软件开发公司_山西软件开发公司_木子天禾科技官网

地址:山西省太原市小店区恒大未来城5-1711
手机:15934152105

咨询热线17319297980

JS获取照片拍摄的角度属性问题调整

发布时间:2020-11-03 22:24人气:

今天处理一个人脸合成的项目,首先自拍人脸并上传,其次调用百度人脸合成接口进行合成,但是遇到一个问题,部分手机上传自拍时,人脸招照片自动旋转了90度。正常应该是竖的。百度发现问题是在微信里ios手机上传竖拍照片会自动旋转90度,与拍摄时的角度不同,所以需要做如下处理


1、使用EXIF.js可以获取到照片的拍摄属性:

API 方法

名称 说明
EXIF.getData(img, callback)

获取图像的数据

能兼容尚未支持提供 EXIF 数据的浏览器获取到元数据。

EXIF.getTag(img, tag) 获取图像的某个数据
EXIF.getAllTags(img) 获取图像的全部数据,值以对象的方式返回
EXIF.pretty(img) 获取图像的全部数据,值以字符串的方式返回













 


		
//获取照片方向角属性,用户旋转控制 
            EXIF.getData(files, function() {
                //alert(EXIF.getTag(this, 'Orientation'));  
                Orientation = EXIF.getTag(this, 'Orientation'); 
//                return; 
            });


其中Orientation就是拍摄的角度信息;其他参数信息可以查看:http://code.ciaoca.com/javascript/exif-js/

注意:这里我的files是获取的文件格式的图片,files[0]获取的。

Orientation属性说明如下:

旋转角度 参数
1
顺时针90° 6
逆时针90° 8
180° 3



 










2、判断照片需要旋转多少角度并使用canvas对其旋转处理:

复制代码
//修复ios 
                            if (navigator.userAgent.match(/iphone/i)) {
                                var img = new Image();
                                img.src = resImg.src;
                                img.onload = function(){
                                    var canvas=document.createElement("canvas");
                                    var ctx=canvas.getContext("2d");
                                    var imgWidth = canvas.width = this.width;    
                                    var imgHeight = canvas.height = this.height; 
                                    //如果方向角不为1,都需要进行旋转 added by lzk 
                                    if(Orientation && Orientation != 1){
                                        switch(Orientation){
                                            case 6:     // 旋转90度
                                                canvas.width = this.height;    
                                                canvas.height = this.width;    
                                                ctx.rotate(Math.PI / 2);
                                                // (0,-imgHeight) 从旋转原理图那里获得的起始点
                                                ctx.drawImage(this, 0, -imgHeight, imgWidth, imgHeight);
                                                break;
                                            case 3:     // 旋转180度
                                                ctx.rotate(Math.PI);    
                                                ctx.drawImage(this, -imgWidth, -imgHeight, imgWidth, imgHeight);
                                                break;
                                            case 8:     // 旋转-90度
                                                canvas.width = imgHeight;    
                                                canvas.height = imgWidth;    
                                                ctx.rotate(3 * Math.PI / 2);    
                                                ctx.drawImage(this, -imgWidth, 0, imgWidth, imgHeight);
                                                break;
                                        }
                                    }else{
                                        ctx.drawImage(this, 0, 0, imgWidth, imgHeight);
                                    }
                                    var base64code=canvas.toDataURL("image/png",1);
                                    $(resImg).attr("src",base64code);
                                    var $blob = baseToBlobImg(base64code);
                                    if($(_self).attr('id') == 'hiddenServerId'){
                                        chooseImgList[0].serverImg = $blob //接收blob
                                    
                                    }else{
                                        chooseImgList[1].serverImg = $blob //接收blob
                                    }
                                                                        
                                }
                                
                            }else{
                                //非苹果手机压缩后上传
                                var base64code = resImg.src;
                                var $blob = baseToBlobImg(base64code);
                                if($(_self).attr('id') == 'hiddenServerId'){
                                    chooseImgList[0].serverImg = $blob //接收blob
                                
                                }else{
                                    chooseImgList[1].serverImg = $blob //接收blob
                                }
                            }
复制代码

3、将处理后的图片最后转换成bold类型文件上传:

复制代码
/*将base64的图片转换为blod格式上传*/
    function baseToBlobImg(base64code){
        var arr = base64code.split(','), mime = arr[0].match(/:(.*?);/)[1],
            bstr = atob(arr[1]),
            n = bstr.length,
            u8arr = new Uint8Array(n);
        while(n--) {
            u8arr[n] = bstr.charCodeAt(n);
        }
        
        return obj = new Blob([u8arr], {type:mime});
    }  
复制代码

推荐资讯

17319297980