news 2026/8/28 15:09:19

5 分钟上手 node-exif:一张 JPEG 里藏了多少照片信息?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
5 分钟上手 node-exif:一张 JPEG 里藏了多少照片信息?

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 时间与日期
互操作性interoperabilityEXIF 版本兼容信息
厂商信息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)本地批量处理
传 Buffernew ExifImage({ image: buf }, cb)上传到服务器、未落盘的文件流
实例复用实例化后多次loadImage(path, cb)一个实例连续解析多张图

两个选项点到为止:

  • maxEntries:限制解析条目数。解析来源不可信的图片前务必设上限,挡住超大 Exif 结构拖慢服务。
  • fixThumbnailOffset:修正缩略图偏移,让内嵌缩略图能被正确截取。

核心实现见 lib/exif/ExifImage.js,更多说明见 README.md,厂商私有参数逻辑集中在 lib/exif/makernotes/。

翻车自救指南

按踩坑频率从高到低排:

时间格式先转换

exif.DateTimeOriginalYYYY:MM:DD HH:MM:SS(冒号分隔),直接插库会乱。入库前转成标准时间戳或YYYY-MM-DD HH:MM:SS,顺手把 GPS 时间也做同样处理。

Buffer 字段要转字符串

ExifVersionColorSpace这类字段以 Buffer 形式返回,直接渲染到页面会打出乱码。展示前先toString()或转数字。

makernote 单独容错

厂商私有格式各说各话,已内置 AGFA、Epson、富士、奥林巴斯、松下、三洋六家;未支持的机型解析可能抛错。建议try住这一支,保证imageexifgps这些主流字段照常可用。

解析不可信文件设好上限

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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 15:03:15

MATLAB绘图入门:从核心语法到实战技巧,掌握数据可视化

1. 项目概述&#xff1a;为什么从绘图开始学MATLAB&#xff1f;如果你刚开始接触MATLAB&#xff0c;或者已经用它算了一堆数据却不知道怎么直观地展示出来&#xff0c;那你来对地方了。很多人把MATLAB当成一个超级计算器&#xff0c;但它的绘图能力才是真正能让你的数据“说话”…

作者头像 李华
网站建设 2026/8/28 15:02:47

30 类从零实现教程:build-your-own-x 完整上手指南

30 类从零实现教程&#xff1a;build-your-own-x 完整上手指南 【免费下载链接】build-your-own-x Master programming by recreating your favorite technologies from scratch. 项目地址: https://gitcode.com/GitHub_Trending/bu/build-your-own-x build-your-own-x …

作者头像 李华
网站建设 2026/8/28 15:01:21

数学建模中函数应用全解析:从概念到代码的实战指南

1. 从“函数”到“建模”&#xff1a;为什么它比你想象的更重要如果你刚开始接触数学建模&#xff0c;或者已经参加过一两次比赛&#xff0c;可能对“函数”这个概念既熟悉又陌生。熟悉是因为&#xff0c;从初中数学的y f(x)开始&#xff0c;它就像空气一样无处不在&#xff1…

作者头像 李华
网站建设 2026/8/28 15:00:53

ABAP 里有没有 TypeScript 的 any,有一个同名的 any,但两者其实是两套完全不同的类型哲学

在 TypeScript 代码里看到 any 时,我们通常会立刻产生一种很明确的印象,类型系统到这里暂时失去约束了。一个变量只要被声明成 any,后面访问一个编译器完全不知道的属性、调用一个编译器完全不知道的方法,甚至把它赋值给 number、string 或其他类型,TypeScript 编译器通常…

作者头像 李华
网站建设 2026/8/28 14:59:13

基于视觉语言模型的Web-Scale搜索相关性度量实践

先记录一下&#xff1a;搜索系统在很长一段时间里都默认“相关性 文本相似度”&#xff0c;但随着商品、短视频、图文页这类多模态内容占据主要流量&#xff0c;纯文本相关性判断越来越力不从心。一个用户搜索“黑色运动鞋 男士”&#xff0c;返回的页面上图片是一双棕色皮鞋&…

作者头像 李华