5 分钟上手 node-exif:一张 JPEG 里藏了多少照片信息?
【免费下载链接】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
相册里那张照片,你大概率说不清它是哪台相机拍的、光圈快门用了多少——这些信息其实一直都在,只是被写进了 JPEG 文件的"暗格"里,也就是Exif 元数据。
node-exif(npm 包名exif)就是专门打开这个暗格的轻量库:传入一张 JPEG,回调里直接拿到相机型号、光圈、快门、ISO、焦距、GPS 坐标和方向标记。
适合谁?
- 想给照片库建参数索引的 Node.js 开发者
- 需要自动做照片方向校正的图片服务维护者
- 想按 GPS 坐标还原旅行时间线的人
库很轻,零配置,回调风格 API,上手成本约等于一次npm install。
三步跑起来
第一步:装包。一条命令,没有其他依赖要操心。
第二步:跑最小示例。下面这段是全文唯一的代码,挑一张带 Exif 的 JPEG 直接解析,拿到拍摄参数后打印关键几项:
const { ExifImage } = require('exif'); new ExifImage({ image: 'photo.jpg' }, (err, data) => { if (err) { console.error(err.message); return; } console.log(data.image.Make); // 相机品牌型号 console.log(data.exif.ISOSpeedRatings); // ISO console.log(data.exif.FNumber); // 光圈 console.log(data.exif.ExposureTime); // 快门 });第三步:看输出。解析结果是一个对象,顶层分 6 大块,每块下面是一组"字段名 → 值"的键值对,比如image.Make是相机品牌型号、exif.FNumber是光圈。
一次解析能拿到什么
6 大类数据一次给齐:
| 数据类别 | 字段 | 里面有什么 |
|---|---|---|
| 图片信息 | image | 相机品牌型号、方向、分辨率、软件、版权 |
| 缩略图 | thumbnail | 内嵌缩略图的偏移与长度 |
| 拍摄参数 | exif | 光圈、快门、ISO、焦距、原始拍摄时间 |
| 位置信息 | gps | 经纬度、GPS 时间与日期 |
| 互操作性 | interoperability | EXIF 版本兼容信息 |
| 厂商信息 | makernote | 私有参数,内置 AGFA、Epson、富士、奥林巴斯、松下、三洋六家 |
拿项目测试目录里那张 Sony ILCE-6000 的夜景照片做例子,一次图片 Exif 提取能读出:ISO 100、光圈 F8、6 秒长曝光、33mm 等效焦距,连镜头型号E PZ 16-50mm F3.5-5.6 OSS都带出来了。字段全,意味着归档、检索、展示都有原料。
接到真实工作流里
解析出来的字段怎么落地?一条"解析 → 入库 → 展示"的流水线,分三步走。
如何批量导出照片拍摄参数
遍历目录下的 JPEG,逐张提取相机型号、拍摄时间、光圈、快门、焦距、ISO,追加写入 CSV 或数据库表。照片库从"一堆文件夹"变成可查询的档案库:WHERE 光圈 = 'F8' AND ISO < 200这类条件直接可用。
照片方向不对怎么修
相册里总有些照片显示是倒的或侧的。原因:JPEG 像素本身没旋转,姿态由image.Orientation字段声明,8表示逆时针旋转 90° 才是正常朝向。入库前读出该字段,按映射规则生成"已摆正"的副本,用户端就彻底告别旋转逻辑。
GPS 坐标读取与地理时间线
带定位的照片会返回经纬度和 GPS 时间、日期。把坐标写进库,就能做三件事:地图上聚类展示旅行足迹、按 GPS 时间戳自动还原拍摄顺序、逆地理编码生成"拍摄于 XX 城市"标签。这是 Node.js 图片元数据管理里最有获得感的一环。
三种调用方式 + 两个实用选项
| 方式 | 用法 | 适合场景 |
|---|---|---|
| 传文件路径 | new ExifImage({ image: 'a.jpg' }, cb) | 本地批量处理 |
| 传 Buffer | new ExifImage({ image: buf }, cb) | 上传到服务器、未落盘的文件流 |
| 实例复用 | 实例化后多次loadImage(path, cb) | 一个实例连续解析多张图 |
两个选项点到为止:
maxEntries:限制解析条目数。解析来源不可信的图片前务必设上限,挡住超大 Exif 结构拖慢服务。fixThumbnailOffset:修正缩略图偏移,让内嵌缩略图能被正确截取。
核心实现见 lib/exif/ExifImage.js,更多说明见 README.md,厂商私有参数逻辑集中在 lib/exif/makernotes/。
翻车自救指南
按踩坑频率从高到低排:
时间格式先转换
exif.DateTimeOriginal是YYYY:MM:DD HH:MM:SS(冒号分隔),直接插库会乱。入库前转成标准时间戳或YYYY-MM-DD HH:MM:SS,顺手把 GPS 时间也做同样处理。
Buffer 字段要转字符串
ExifVersion、ColorSpace这类字段以 Buffer 形式返回,直接渲染到页面会打出乱码。展示前先toString()或转数字。
makernote 单独容错
厂商私有格式各说各话,已内置 AGFA、Epson、富士、奥林巴斯、松下、三洋六家;未支持的机型解析可能抛错。建议try住这一支,保证image、exif、gps这些主流字段照常可用。
解析不可信文件设好上限
maxEntries不是可选项,是上传接口的标配。配合文件类型预检,恶意构造的超大结构基本进不了回调。
只认 JPEG
node-exif 只读 JPEG。PNG、WebP 没有 Exif 容器,别浪费回调。入口先过滤扩展名和文件头,再决定是否调用解析。
下一步
先拿 10 张手边的 JPEG 跑一遍最小示例,把回调里的字段全贴出来看一眼。看完再决定先上参数归档还是方向校正,顺序由你自己定。
【免费下载链接】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),仅供参考