EXIF 标准:图片的数字身份证
EXIF(Exchangeable Image File Format,可交换图像文件格式)是嵌入在图片文件中的元数据标准,由日本电子工业振兴协会(JEITA)于 1998 年制定。它记录了照片从拍摄到存储的完整上下文信息——相机型号、镜头参数、拍摄设置、GPS 位置、时间戳等,相当于图片的”数字身份证”。
配套工具:EXIF 信息查看器
为什么 EXIF 如此重要
EXIF 元数据在三个维度具有不可替代的价值:
- 摄影技术分析:光圈、快门、ISO、焦距等参数帮助摄影师复盘拍摄决策,理解好照片的技术基础
- 数字取证与版权:相机序列号、拍摄时间戳是图片真实性的证据链,版权信息支持作品确权
- 位置与时间回溯:GPS 坐标和原始时间戳记录了照片的真实拍摄时空,不可被文件重命名篡改
JPEG 文件结构与 EXIF 嵌入位置
理解 EXIF 的前提是了解 JPEG 文件的二进制结构。JPEG 文件由一系列”段”(Segment)组成,每段以 0xFF 标记字节开头:
| 标记 | 名称 | 作用 |
|---|---|---|
FFD8 | SOI | 图片起始标识 |
FFE0 | APP0 | JFIF 标识段 |
FFE1 | APP1 | EXIF 数据段 |
FFDB | DQT | 量化表 |
FFC0 | SOF0 | 帧起始(含图片尺寸) |
FFC4 | DHT | 霍夫曼表 |
FFDA | SOS | 扫描数据起始 |
FFD9 | EOI | 图片结束标识 |
EXIF 数据嵌入在 APP1 段(标记 FFE1)中。当相机或手机保存 JPEG 时,拍摄参数作为 EXIF 数据写入 APP1 段,紧随 SOI 标记之后。这也是为什么 EXIF 解析只需读取文件头部——APP1 段位于文件最前面。
TIFF 头:EXIF 的数据容器
APP1 段内部采用 TIFF 格式存储数据。TIFF 头的结构如下:
字节偏移 长度 说明
0 2 字节序标识:4D4D=大端序(Big Endian),4949=小端序(Little Endian)
2 2 TIFF 魔数:002A(42)
4 4 第一个 IFD 的偏移量
字节序标识让解析器知道如何正确读取多字节数值——不同相机厂商可能使用不同字节序。TIFF 魔数 42 是格式验证的标识。
IFD:标签的目录结构
EXIF 数据的核心组织单位是 IFD(Image File Directory,图像文件目录)。每个 IFD 是一个标签数组,结构为:
- 2 字节:标签数量
- 每个标签 12 字节:标签 ID(2) + 数据类型(2) + 数据数量(4) + 数据值/偏移量(4)
- 4 字节:下一个 IFD 的偏移量(0 表示无后续 IFD)
标签的数据类型决定了如何解读值/偏移量字段:
| 类型 ID | 类型名称 | 字节长度 | 典型用途 |
|---|---|---|---|
| 1 | BYTE | 1 | 枚举值 |
| 2 | ASCII | 1 | 字符串(以 \0 结尾) |
| 3 | SHORT | 2 | 短整数(光圈、ISO) |
| 4 | LONG | 4 | 长整数(分辨率) |
| 5 | RATIONAL | 8 | 分数(两个 LONG:分子/分母) |
当数据超过 4 字节时,值字段存储的是指向实际数据的偏移量。RATIONAL 类型用两个整数表示分数——这是拍摄参数的核心存储方式:快门速度 1/200 存储为分子 1、分母 200;光圈 f/2.8 存储为 28/10。
IFD 层级体系
EXIF 数据由多个 IFD 组成,各司其职:
- IFD0:基础图片信息(尺寸、方向、分辨率、相机型号)
- Exif IFD:拍摄参数(光圈、快门、ISO、焦距、闪光灯)
- GPS IFD:定位信息(经纬度、海拔、时间戳)
- IFD1:缩略图数据
IFD0 中有一个指针指向 Exif IFD,Exif IFD 中有指针指向 GPS IFD。这种嵌套结构使 EXIF 可以扩展而不破坏向前兼容。
常见拍摄参数标签详解
曝光三要素
| 标签 | 键名 | 数据类型 | 示例值 | 含义 |
|---|---|---|---|---|
| 感光度 | ISO | SHORT | 400 | 传感器感光灵敏度 |
| 光圈值 | FNumber | RATIONAL | 28/10 → f/2.8 | 镜头通光孔径 |
| 快门速度 | ExposureTime | RATIONAL | 1/200 → 1/200 秒 | 传感器曝光时长 |
焦距与对焦
- FocalLength(焦距):RATIONAL 类型,如 50/1 → 50mm。焦距决定视角范围与透视关系
- FocalLengthIn35mmFormat(35mm 等效焦距):考虑传感器裁切系数后的等效值。APS-C 画幅 35mm 镜头等效约 52mm
闪光灯状态
Flash 标签是一个位掩码(BITMAP),每一位有不同含义:
- 第 0 位:是否闪光(0=未闪光,1=已闪光)
- 第 1-2 位:闪光返回状态
- 第 3-4 位:闪光模式(0=未知,1=强制闪光,2=强制关闭,3=自动)
- 第 5-6 位:闪光功能是否存在
本工具简化判断 (value & 1) === 1 来区分闪光灯是否触发。
GPS 坐标处理
支持 GPS 的设备在拍照时记录拍摄位置的经纬度坐标。EXIF 中的 GPS 数据采用度分秒(DMS)格式加方向参考:
GPSLatitudeRef: 'N' (北纬) 或 'S' (南纬)
GPSLatitude: [度, 分, 秒] 三个 RATIONAL 值
GPSLongitudeRef: 'E' (东经) 或 'W' (西经)
GPSLongitude: [度, 分, 秒] 三个 RATIONAL 值
GPSAltitude: 海拔高度(米,RATIONAL)
GPSAltitudeRef: 0=海平面以上,1=海平面以下
DMS 转十进制度数
将度分秒转换为十进制度数的公式:
十进制度数 = 度 + 分/60 + 秒/3600
若为南纬(S)或西经(W),取负值
例如 39°54’15.12” → 39 + 54/60 + 15.12/3600 = 39.9042°。exifr 的 reviveValues 选项自动完成此转换,输出为十进制度数(如 39.9042),本工具据此生成 OpenStreetMap 地图链接。
exifr 库的浏览器端实现
本工具采用 exifr 作为解析引擎,这是 JavaScript 生态中最成熟的 EXIF 解析库。其核心设计:
模块化解析架构
exifr 将解析过程分解为三个独立层:
- 文件解析器(FileParser):识别文件格式(JPEG/TIFF/PNG/HEIC),定位元数据段位置
- 段解析器(SegmentParser):解析特定元数据标准(EXIF/IPTC/XMP/ICC),各有独立实现
- 文件读取器(FileReader):抽象数据读取,支持 Blob/Buffer/Base64/URL 多种输入源
这种分层设计让 exifr 可以按需加载——只需要 EXIF 时不会解析 XMP,减小解析开销。
translateKeys 与 reviveValues
exifr 提供两个关键的格式化选项:
- translateKeys:将数字标签 ID 翻译为可读名称(如
0x829A→ExposureTime) - translateValues:将枚举值翻译为描述文字(如 Flash 的位掩码 → “Off, Did not fire”)
- reviveValues:将原始数据还原为语义化值(如 GPS 度分秒 → 十进制度数,时间字符串 → Date 对象)
本工具启用全部三个选项,获得最友好的解析结果。
浏览器端的 Blob 读取
exifr 在浏览器中通过 BlobReader 读取文件,支持 File 和Blob 输入。关键优化是分块读取——不将整个文件加载到内存,而是按需读取元数据段所在区域(通常在文件前 64KB 内)。这对大图尤其重要:一张 20MB 的 RAW 照片,EXIF 数据可能只在前 10KB,分块读取避免无谓的内存占用。
隐私与安全考量
EXIF 中的隐私风险
EXIF 元数据可能包含敏感信息:
- GPS 定位:家庭住址、工作地点、常去场所的精确坐标
- 相机序列号:设备唯一标识,可关联同一设备的多张照片
- 拍摄时间:精确到秒的时间戳,暴露行为规律
社交平台(微信、微博、QQ)在分享图片时会默认压缩并剥离 EXIF,但直接发送原图(如邮件附件、云盘分享)会保留完整元数据。
浏览器端解析的隐私优势
本工具完全在浏览器本地解析 EXIF,不发送任何数据到服务器:
- 图片文件通过
URL.createObjectURL()加载,不离开浏览器内存 - exifr 在 JavaScript 环境中解析,无网络请求
- 解析结果仅展示在页面中,用户关闭页面即销毁
这种设计适合处理含敏感信息的照片——即使含私人 GPS 定位的照片,也不会因查看元数据而泄露。
清除 EXIF 保护隐私
如需在分享前清除 EXIF,可使用本站的图片压缩工具——Canvas API 在重新编码时会丢弃原始 EXIF 数据。也可在系统照片应用中关闭位置信息,或使用专业工具按需保留/移除特定标签。
与图片工具链的协同
本工具与现有图片工具形成完整链路:
- Base64 图片互转:图片 ↔ Base64 编码转换
- 图片压缩工具:体积优化(同时清除 EXIF)
- EXIF 信息查看器:元数据读取与分析
典型场景:先用 EXIF 查看器检查照片的拍摄参数与隐私信息,再用图片压缩工具优化体积并清除敏感元数据,最后用 Base64 工具嵌入网页或文档。