图片自动旋转的前端实现方案

In: 前端技术  

15 02 2012

随着智能手机的普及,大家已经习惯随手拍点照片传网上了。有时候传上去的照片方向会不对,甚至还有脑袋朝下的情况。为此,各大微博不约而同的给照片增加左右旋转的功能。这样能解决问题,但我们是否能更进一步,自动选择正确的照片方向呢?刚好最近我们有类似的场景,本文就讨论下这个问题。

实际上,数码设备拍摄照片时,会把许多属性附加在照片文件里,这些属性构成了大家常说的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信息,还是后端获取完,存在数据库比较靠谱。

参考:

  1. JPEG Rotation and EXIF Orientation
  2. Read EXIF data with Javascript

本文链接:http://www.imququ.com/post/how_to_auto-rotate_photo_in_js.html

--EOF--

3 Pingbacks

8 Responses to 图片自动旋转的前端实现方案

Avatar

welefen

Feb. 15, 2012, 9:08 a.m.

靠谱,可以搞个存储时进行自动转化,这样就利于网络上传输了。

Avatar

JK

Feb. 15, 2012, 10:02 a.m.

赞。。。浏览器都可以做这事啊。。。

Avatar

a4

Feb. 15, 2012, 10:56 a.m.

赞,这个好

Avatar

tjs

Feb. 15, 2012, 11:37 a.m.

一直以为那个方向是在生成的时候设备自动调整了方向。。今天才知道原来是展现时程序搞的

Avatar

miller

Feb. 15, 2012, 3:20 p.m.

高级啊

Avatar

Cat Chen

Feb. 15, 2012, 3:59 p.m.

看到 charCodeAt……我想我还是用 File API 好了。现在 File API 多方便啊~

Avatar

poker

Feb. 16, 2012, 6:59 p.m.

经典的二进制处理方案

Avatar

dron

Feb. 28, 2012, 8:35 p.m.

有意思。

Comment Form

 *

 *

 

*

 *

关于我

JerryQu,当前从事前端开发,@中国北京
这里是我随便记录东西的地方~
需要找我,我的联系方式在这里»
查找QGYWebIM相关信息,请点这里»

  • PPanda sftp如何同步本地文件夹呢?
  • dron 嗯!太有用了,终于完美找回 EditPlus 的感觉了。
  • 袁源 还真的是这样。其实挺佩服微软的呀~就是都太不完善了
  • 三水清 类似功能可以使用fiddler,http://ming.sinaapp.com/?p=218
  • 呆呆 非常感谢~话说我现在想把weinre变成一个服务器,就是我在电脑上修改了,手机上访问可以直接,不知道[...]
  • 困扰了我好几天的问题,不过最后还是让我解决了,要早让我看见这个文章该多好啊,那我也不用烦恼那么久了~[...]
  • hoowolf 非常感谢你的工作!!!
  • welefen 恩,去年我们在新首页导航精准下线的时候也遇到过,当时还做了对用户影响的数据评估和分析。
  • 唠叨下 我们这边测试的时候是在刚做完 preload 后的系统上测试的,就跟刚装完操作系统后一样干净。怎么说[...]
  • gust 我是在ubuntu11.10环境下
  • gust 想用google浏览器的话可以这样 webbrowser.get('/usr/bin/google[...]
  • jin 怎么zenCoding的缩写设置呢,类似editplus下的acp配置
  • Jerry Qu @Feather,确实Shadow是基于Weinre封装的。在我这里也很慢,因为它连的是http:/[...]
  • Feather 谢谢分享,其实Adobe的Shadow产品貌似也是用这个原理来做的,不过shadow封装好,比较方便[...]
  • i am bug 感谢屈屈!