node-exif Exif 解析完整指南:三步给照片建好元数据归档系统
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
找老照片时,你是不是也抓狂过:这张照片什么时候拍的?用哪台相机?光圈快门是多少?答案其实一直藏在文件里——那就是 Exif 元数据。node-exif(npm 包名exif)是一款面向 Node.js 的轻量级 Exif 解析库,专门从 JPEG 照片里读出相机型号、光圈快门、GPS 位置、拍摄时间等信息。
这篇文章带你把它用起来:先看它到底能读出什么,再讲怎么装、怎么调,最后按三条实际工作流落地,附一份避坑清单。
先认清家底:一张照片里藏着六类数据
相机保存 JPEG 时,会在像素之外再塞一份"档案"。node-exif 解析后,把这份档案归成6 大类返回:
| 类别 | 关键字段 | 典型内容 |
|---|---|---|
| 图片信息 | image | 相机品牌型号、方向(Orientation)、分辨率、后期软件、版权 |
| 内嵌缩略图 | thumbnail | 缩略图数据的偏移与长度 |
| 拍摄参数 | exif | 光圈、快门、ISO、焦距、原始拍摄时间 |
| 位置信息 | gps | 经度、纬度、拍摄日期、GPS 时间 |
| 互操作性 | interoperability | EXIF 版本兼容信息 |
| 厂商信息 | makernote | 各品牌私有参数(富士、奥林巴斯、松下等) |
以项目里的这张红苹果样张为例,看似普通的一张图,过一遍 node-exif 后,相机型号、曝光参数、拍摄时间这些字段就能被逐条读出来,归档素材就齐了:
测试用例也能说明问题。sony-alpha-6000.jpg里能读出 Sony ILCE-6000、ISO 100、F8、6 秒长曝光、33mm 等效焦距,连镜头型号E PZ 16-50mm F3.5-5.6 OSS都写得明明白白。
安装与调用:三种姿势拿数据
一条命令装好:
npm install exif核心调用就一行,把图片交给ExifImage:
new ExifImage({ image: 'photo.jpg' }, (error, exifData) => { console.log(error ? error.message : exifData); });除了传文件路径,还有另外两种用法:
| 调用方式 | 适用场景 |
|---|---|
new ExifImage({ image: 'a.jpg' }, cb) | 本地批量处理,直接传路径 |
new ExifImage({ image: buffer }, cb) | 处理上传到服务器的文件流 |
exif.loadImage(path, cb) | 一个实例复用,连续解析多张图 |
核心实现在lib/exif/ExifImage.js,支持maxEntries、fixThumbnailOffset等选项做精细控制。
实战一:一条命令批量提取拍摄参数,建好归档索引 🗂️
把一整个旅行相册丢进去循环解析,把相机型号、光圈、快门、焦距逐条写入 CSV 或数据库,就是一份可检索的参数档案。
拿测试图evil1.jpg打个样:Canon PowerShot S400 拍摄、时间2003:05:24 16:40:33、曝光 0.125 秒、F2.8、焦距 7.4mm,甚至记录着后期软件Adobe Photoshop 7.0。这些字段正是归档系统里最有检索价值的部分。
实战二:三步修正"方向不对"的照片 🔄
手机照片经常倒着、横着显示——像素本身没转,正确姿态由 Exif 的Orientation字段描述。测试图right.jpg就是典型:像素是竖排的,但字段标记Orientation: 8,说明要逆时针转 90° 才正。
处理流程三步走完:
- 用 node-exif 读出
image.Orientation; - 按规则旋转(1 正常、6 顺时针 90°、8 逆时针 90° 等);
- 落盘一份"方向已修正"的副本,用户端就再也不会看到倒图。
实战三:把 GPS 坐标串成地理时间线 📍
带定位的照片会在gps字段里返回经度、纬度、GPS 日期与时间。测试图short-ascii-II.jpg(小米 MI3 拍摄,4208×3120 像素)就有完整数据:拍摄日期2015:02:28、GPS 时间 9:10:49。
坐标入库后,玩法就多了:
- 地图上按坐标聚类,拼出旅行足迹;
- 按 GPS 时间戳排序,自动还原拍摄顺序;
- 接逆地理编码,把坐标翻译成"拍摄于 XX 城市"的标签。
避坑清单:动手前花一分钟看完 ⚠️
- 只认 JPEG:PNG 等格式没有 Exif 容器,批量前先过滤一遍。
- makernote 要容错:个别厂商私有格式解析可能返回 error,捕获住即可,不影响其他字段。各品牌的解析逻辑集中在
lib/exif/makernotes/目录,目前内置 AGFA、Epson、富士、奥林巴斯、松下、三洋六家。 - Buffer 字段先转换:
ExifVersion、ColorSpace等字段以 Buffer 形式返回,展示前记得转成字符串或数值。 - 给不可信文件上保险:解析来路不明的图片时设置
maxEntries,防止异常超大结构拖慢服务。 - 时间格式要入库前处理:
DateTimeOriginal是YYYY:MM:DD HH:MM:SS冒号格式,直接存库会埋雷,先转成标准时间格式。
写在最后
包的基本信息见package.json,更多用法细节看README.md。node-exif 的 API 简单到几乎没有学习成本:归档参数、校正方向、串起地理时间线,照片元数据管理系统的三块核心积木,它一次就给了你。
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考