JS获取照片拍摄的角度属性,用于旋转控制

摘要:
在微信中,ios手机上传的垂直照片会自动旋转90度,这与拍摄时的角度不同,因此需要进行处理:1。使用EXIF.js获取照片的拍摄属性:API方法名称描述了EXIF.getData获取的图像数据可以与尚未支持提供EXIF数据以获取元数据的浏览器兼容。方向属性描述如下:旋转角度参数0°1顺时针90°6逆时针90°8180°32确定照片需要旋转多少角度并使用画布旋转://修复ioif{variamg=newImage();img.src=resImg.src;img.onload=function(){varcanvas=document.createElement;varctx=canvas.getContext;variamgWidth=canvas.width=this.width;variamgHeight=canvas.height=this.height;//如果方向角度不是1,则需要旋转addedbylzkif(orientation&&orientation!

在微信里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});
    }  

可借鉴CSDN里林志Ke的帖子:利用exif.js解决ios手机上传竖拍照片旋转90度问题

免责声明:文章转载自《JS获取照片拍摄的角度属性,用于旋转控制》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇css实现网格背景[小技巧]window10删除此电脑左侧栏中的非磁盘文件夹下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

js获取url中指定参数的值(含带hash)

function getUrlVars() { var vars = {}; var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (m, key, value) {...

js 完成对图片的等比例缩放的方法

1 /* 2 重新按比例设置 页面上对应图片的长和高, 3 */ 4 function resetImgSize(id,imgWidth,imgHeight,posWidth,posHeight) { 5 var width = 0; 6 var height = 0; 7 // 按比例缩小图片的算法 8...

前端 ArrayBuffer 与 Blob 互转

我们在使用ajax向后端发送请求时,responseType可以设置返回数据的格式,它支持的格式有"text"、"arraybuffer"、"blob"、"document",返回的对应数据为DOMString、ArrayBuffer、Blob、Document 前端在请求二进制数据的时候需要将responseType设置成arraybuffer。 arr...

js延迟执行函数

转自:http://zou-jiao.iteye.com/blog/1606872 在js中,延迟执行函数有两种:setTimeout和setInterval,用法如下: setTimeout("test()","2000"); //2000毫秒后执行test()函数,只执行一次。 setInterval("test()","2000"); //每隔20...

原生JS实现ajax与ajax的跨域请求

一、原生JS实现ajax 第一步获得XMLHttpRequest对象 第二步:设置状态监听函数 第三步:open一个连接,true是异步请求 第四部:send一个请求,可以发送一个对象和字符串,不需要传递数据发送null 第五步:在监听函数中,判断readyState=4&&status=200表示请求成功 第六步:使用responseTe...

base64图片转化成文件

承接《vue截取video视频中的某一帧》视频截取后保存的是base64格式,没法上传服务器,需要转化一下 //将base64转换为文件 dataURLtoFile(dataurl, filename) { let arr = dataurl.split(',') let mime = arr[0].match(/:(.*?);/)[1];...