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

在微信里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度问题

原文地址:https://www.cnblogs.com/amor17/p/9013169.html

时间: 2024-11-02 13:28:36

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

通过js获取元素的css样式属性

var display = this.currentStyle? this.currentStyle.display: window.getComputedStyle(this, null).display; 这样可以获取定义在内部~外部样式表以及内嵌的所有的样式~当然这里指获取display属性~简单来说就是只要定义了display~不管在哪里设置的~都可以获取出来

用JS获取CSS中的某个属性值:getComputedStyle

css文件中如何得到某个属性值: 一.getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值, 返回的是一个CSS样式声明对象 , 只读, 此方法支持Firefox浏览器; 语法:var style=window.getComputedStyle("元素","伪类");第一个参数是必须的,第二个为可选的. 二.currentStyle 是一款可以兼容IE浏览器的属性返回的是当前所有最终使用的CSS属性值, 利用element.Current

对于用js获取元素的css样式属性(getComputedStyle,currentStyle,style)(getPropertyValue,getAttribute)

首先单独拎出来讲的是style style: nodeObject.style.cssProperty获取的是DOM节点上 style 属性定义的样式,如果不存在 style 属性,或者 style 属性没有定义相应的样式,则是无法获取的.也就是说,JavaScript 不会到 <style> 标签或者 CSS 文件去获取相应的样式,只能获取 style 属性定义的样式. 就是外部样式表,内部样式表,用style都是无效的,只有内联样式是有效的,当然用style写入也是写入在内联样式的. 然后

js 获取相同name元素的属性值

如图有8-12月5个文本域,id为plan8-12,name同为plan. 现在要获取name同为plan的所有属性值: 方法一: var allplan =document.getElementsByName('plan'); for ( var int = 0; int < allplan.length; int++) { console.info("方法一:"+allplan[int].id+":"+allplan[int].value); } 控制台输

原生JS的使用,包括jquery和原生JS获取节点、jquery和原生JS修改属性的比较

一.前言 相比于JS这条直达终点.满是荆棘的小路,jquery无疑是康庄大道了,足够的简洁.易用给了它辉煌的地位.然而,毕竟是绕着道的插件,当小路走着走着变成大路的时候,曾经的大路也就失去了他自身的优势了. 原生JS虽然没有jquery那么的好用.便捷,或者说没有jquery那样让我们使用的如此顺手,甚至是无法舍弃的依赖.可是我们依然不得不扔掉手中这根陪伴我们多年的拐杖,我们不是瘸子,我们不曾腐朽,我们还可以独立前行. 二.正文 1. jquery和原生JS获取节点的比较 //这是HTML代码,

原生js获取元素的class属性(获取class的所有元素)以及改变或添加calssName

今天在工作中,用到了设置className,因此查阅了一下资料,总结一下. 一.如何用原生js获取class属性 1 <div class = "dom'> 2 </div> 元素JS实现方法: 1 function $class(domclass) 2 { 3 var odiv = document.getElementsByTagName("*"); 4 var aResult = []; //定义一个空数组,用来存放与目标className相同的

js 获取函数的所有参数和遍历JavaScript某个对象所有的属性名称和值的方法

获取所有参数 function test(){ for(var i=0;i<arguments.length;i++)  document.write(arguments[i]); } 遍历某个对象所有的属性名称和值的方法 <script language="javascript"> var obj = new Object(); obj.myname = "我是对象"; obj.pro2 = "23"; obj.pro3 = 

JS获取元素属性

<style> *{ box-sizing: border-box; } html, body { margin: 0px; width: 100%; height: 100%; overflow: hidden; } .main{ width: 600px; height: 300px; margin: 0 auto; background: #999; } #p1{ padding: 10px 20px; } </style> <div class="main&

JS获取CSS属性值

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <ti