随着智能手机的普及,大家已经习惯随手拍点照片传网上了。有时候传上去的照片方向会不对,甚至还有脑袋朝下的情况。为此,各大微博不约而同的给照片增加左右旋转的功能。这样能解决问题,但我们是否能更进一步,自动选择正确的照片方向呢?刚好最近我们有类似的场景,本文就讨论下这个问题。
实际上,数码设备拍摄照片时,会把许多属性附加在照片文件里,这些属性构成了大家常说的Exif信息。访问我的相册会发现照片下也有对应的Exif信息。Exif中有个Orientation字段,用来存放照片方向,这就是我们需要的,看下它的定义:
| EXIF Orientation Value | Row #0 is: | Column #0 is: |
|---|---|---|
| 1 | Top | Left side |
| 2* | Top | Right side |
| 3 | Bottom | Right side |
| 4* | Bottom | Left side |
| 5* | Left side | Top |
| 6 | Right side | Top |
| 7* | Right side | Bottom |
| 8 | Left side | Bottom |
NOTE: Values with "*" are uncommon since they represent "flipped" orientations. via
当然,Exif中的Orientation属性,取决于拍照的设备是否拥有方向传感器。不过根据我的了解,目前大部分数码拍照设备都是支持记录方向的。1是默认值,2、4、5、7表示照片进行了翻转。一般情况下,取值应该是1、3、6、8中的一种。下面有张更形象的图描述了具体的旋转策略:
如何从图片中获取Exif信息,各个语言都有封装好的代码可以直接使用。Javascript也不例外,国外某同学08年就发布了可用代码。他的做法分为两步,首先通过Ajax获取原始二进制,这在firefox和webkit比较好办,在IE下需要借助VBScript的帮忙;第二步是从原始数据不同位置获取相关信息,基本是体力活了。想深入了解的同学可以点本段几个链接围观下。
从图片Exif信息中取到Orientation后,就可以根据它来自动旋转图片了,canvas、filter滤镜、vml、css3都可以实现图片的旋转。网上也有很多封装好的代码可以直接拿过来用。
综合上文,我写了一个demo,除了Opera,兼容大部分其它浏览器(在Opera11.6下测试过,也是OK的)。
另外,如果用FileReader Api获取图片的原始二进制,就可以在浏览器本地实现图片自动旋转。这在图片上传前预览时比较有用,这里有demo。
PS:其实,大部分的图片查看客户端早已支持自动旋转,所以一般情况下数码设备拍的照片用电脑看,方向都是正确的。许多缩略图生成程序,也是可以指定缩放前自动旋转的(例如ImageMagick的-auto-orient参数)。
再PS:纯前端获取图片Exif,只是一种尝试。如果需要频繁使用Exif信息,还是后端获取完,存在数据库比较靠谱。
参考:
本文链接:http://www.imququ.com/post/how_to_auto-rotate_photo_in_js.html
--EOF--
8 Responses to 图片自动旋转的前端实现方案
welefen
Feb. 15, 2012, 9:08 a.m.
靠谱,可以搞个存储时进行自动转化,这样就利于网络上传输了。
JK
Feb. 15, 2012, 10:02 a.m.
赞。。。浏览器都可以做这事啊。。。
a4
Feb. 15, 2012, 10:56 a.m.
赞,这个好
tjs
Feb. 15, 2012, 11:37 a.m.
一直以为那个方向是在生成的时候设备自动调整了方向。。今天才知道原来是展现时程序搞的
miller
Feb. 15, 2012, 3:20 p.m.
高级啊
Cat Chen
Feb. 15, 2012, 3:59 p.m.
看到 charCodeAt……我想我还是用 File API 好了。现在 File API 多方便啊~
poker
Feb. 16, 2012, 6:59 p.m.
经典的二进制处理方案
dron
Feb. 28, 2012, 8:35 p.m.
有意思。