EXIF(Exchangeable Image File)是“可交换图像文件”的缩写,当中包含了专门为数码相机的照片而定制的元数
据,可以记录数码照片的拍摄参数、缩略图及其他属性信息。exif其实是jpeg文件的一种,遵从jpeg标准,只是在文件
头信息中增加了有关拍摄信息的内容和索引图。
JEPG文件头必须以0xFF 0xD8开头,0xFF 0xD9结尾。然后后面会跟着出现以0xFF 0xE0为起始的application0,
0xFF 0xE1为起始的application1,以此类推。而exif信息就再app1里面。
按照 Exif 标准对这些标识符的定义,数码相机可以把各种拍摄信息记入数码图像中,应用软件可以读取这些数据,
再按照 Exif 标准,检索出它们的具体含义,一般而言包括以下一些信息:
标签号
|
Exif 定义名
|
中文定义名
|
备注
|
---|---|---|---|
0x010E | ImageDescription | 图像描述 | - |
0x013B | Artist | 作者 | 使用者的名字 |
0x010F | Make | 生产商 | 相机生产厂家 |
0x0110 | Model | 型号 | 相机型号 |
0x0112 | Orientation | 方向 | 有的相机支持,有的不支持 |
0x011A | XResolution | 水平方向分辨率 | - |
0x011B | YResolution | 垂直方向分辨率 | - |
0x0128 | ResolutionUnit | 分辨率单位 | - |
0x0131 | Software | 软件 | 固件Firmware版本或编辑软件 |
0x0132 | DateTime | 日期和时间 | 照片最后的修改时间 |
0x0213 | YCbCrPositioning | YCbCr定位 | 色度抽样方法 |
0x8769 | ExifOffset | Exif子IFD偏移量 | - |
0x829A
| ExposureTime | 曝光时间 | 即快门速度 |
0x829D | FNumber | 光圈系数 | 光圈的F值 |
0x8822 | ExposureProgram | 曝光程序 | 自动曝光、光圈优先、快门优先、M档等 |
0x8827 | ISOSpeedRatings | ISO感光度 | Exif 2.3 中更新为 “PhotographicSensitivity” |
0x9000 | ExifVersion | Exif 版本 | 参见“历史版本”一节 |
0x9003 | DateTimeOriginal | 拍摄时间 | 照片拍摄的时间 |
0x9004 | DateTimeDigitized | 数字化时间 | 照片被写入内存卡的时间 |
0x9204 | ExposureBiasValue | 曝光补偿 | - |
0x9205 | MaxApertureValue | 最大光圈 | APEX为单位 |
0x9207 | MeteringMode | 测光模式 | 平均测光、中央重点测光、点测光等 |
0x9208 | Lightsource | 光源 | 一般记录白平衡设定 |
0x9209 | Flash | 闪光灯 | 记录闪光灯状态 |
0x920A | FocalLength | 镜头焦距 | 镜头物理焦距 |
0x927C | MakerNote | 厂商注释 | 参见“厂商注释”一节 |
0x9286 | UserComment | 用户注释 | 用户自定义数据 |
0xA000 | FlashPixVersion | FlashPix版本 | - |
0xA001 | ColorSpace | 色彩空间 | 一般为sRGB |
0xA002 | ExifImageWidth | 图像宽度 | 图像横向像素数 |
0xA003 | ExifImageLength | 图像高度 | 图像纵向像素数 |
0xA433 | LensMake | 镜头生产商 | - |
0xA434 | LensModel | 镜头型号 | - |
下面单独对exif进行分析:
FF D8:jpeg文件起始标志
FF E1:app1标志,直接从app1开始,表示没有app0
00F4:app1的长度为244字节
45 78 69 66 00 00:“exif”字符串
49 49:表示小端,小端的时候要格外注意其取字符的时候是从后往前取,才能获得正确的数据。4D 4D表示大端。
2A 00:固定不变
08 00 00 00:固定不变,同时也是偏移量
05 00:表示有5个tag
接下来的,就是各个tag的详细信息:
每一个tag的长度都是12字节。
struct tag{
short id; //tag ID,比如上表的0x011A
short format; //数据格式,比如有些tag信息是数字,有的是文字
int count; //最多的字符个数
offset; //偏移量
}
比如上图:
1A 01:表示ID为0x011A,查表可知,表示水平方向分辨率
05 00:表示有理数、03表示short、02表示ASCII
01 00 00 00:
4A 00 00 00:表示偏移量,因为具体的信息是在后面存储的。这里的偏移需要加上08 00 00 00 = 82字节,而偏移量
要从ff e1后面开始算上图从第五个字符字节开始。此处可偏移到00 00 00 48 00 00 00 01,因为是有理
数,所以前面是分子,后面是分母,总共8个字节。
接下来还会有4个tag信息。
参考文档:
http://www.cppblog.com/lymons/archive/2010/02/23/108266.aspx#ExifMarker