news 2026/10/12 5:55:51

ExifTool入门到实战:图片视频元数据批量读取、写入与清理指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ExifTool入门到实战:图片视频元数据批量读取、写入与清理指南

如果你手头有一堆图片和视频,想快速知道它们是谁拍的、用什么设备拍的、什么时候拍的、甚至拍摄地点的经纬度,第一个浮现在我脑子里的工具永远是 ExifTool。这个开源工具几乎是图像和视频源信息解析领域的标配,支持几十种文件格式,命令行一敲就能把隐藏的元数据全倒出来。这篇文章我会从零开始,讲清楚它到底是什么、怎么装、怎么用它批量化处理你的素材,以及我在实际使用中遇到的坑。我会尽量写得实在一些,适合刚接触元数据处理的人,也适合已经在用但想提高效率的老手。

1. 一张图里原来藏着这么多"看不见的纸条"

很多人拍的 JPG、RAW、MP4,表面上是一段像素或者视频流,实际上文件内部还带了一套"档案纸",记录着拍摄时的各种信息。这套档案纸就是源信息,业界一般叫元数据。ExifTool 处理的就是这些东西,它的名字也来自于最早的照片元数据标准 EXIF。

1.1 照片的"身份证"到底写了什么

我把元数据理解成一张照片的身份证加日志本。一张普通手机照片里面至少包含这几类信息:

  • 设备信息:相机厂商、相机型号、镜头型号、固件版本
  • 拍摄参数:快门速度、光圈、ISO、焦距、测光模式、闪光灯是否打开
  • 时间和日期:拍摄时间、数字化时间、修改时间
  • 图像信息:像素尺寸、分辨率、色彩空间、压缩方式
  • 位置信息:如果手机开了定位,会写入 GPS 纬度、经度、海拔
  • 缩略图:很多相机还会在文件里附带一张小尺寸预览图

这些信息不是 Photoshop 后期加上的文字,而是拍摄时相机根据传感器和处理器状态自动写入的。后期软件也可能追加信息,比如 Adobe 系列会写 XMP 命名空间,Windows 和 macOS 的资源管理器也会读出来给你看,只是它们各写各的字段,格式不完全一样。

表格里可以快速看出不同标准之间的差异:

标准常见于主要内容
EXIF绝大多数相机和手机照片拍摄参数、日期、GPS
IPTC新闻、图库照片作者、标题、关键词、版权、联系方式
XMPAdobe 生态、PDF、RAW版本历史、评级、关键词、相机原始设置
MakerNotes各相机厂商私有区域快门数、序列号等私有数据
QuickTime/MP4视频文件创建时间、录制设备、编码信息、轨道数据

EXIF 是历史最悠久也最基础的那层,IPTC 是图库和新闻行业用来描述画面内容的标准,XMP 则是 Adobe 后来推动的扩展标准。ExifTool 的厉害之处就在于它把这些不同标准统一放在一个命令行工具里读,不用再分别打开三四个软件。

1.2 视频同样有"字幕式"的源信息

视频文件和静态图片不太一样。常见的 MP4、MOV 容器基于 QuickTime 或 ISO BMFF 结构,里面的元数据分散在多处,比如文件头里的标签、视频轨和音轨各自的轨道属性、甚至是每个时间片段里的样本信息。ExifTool 把视频里的创建时间、编码器、码率、帧率、音频采样率、录制设备型号、GPS 轨迹等都能读出来。

有些影视拍摄素材里面还会带记录片场信息的辅助数据,比如摄影机位、镜头参数是否在连续镜头之间有变化。做后期的人用得比较多的是读取每个 clip 的创建时间和摄影机型号,方便批量套 LUT、命名素材、同步多机位。

1.3 ExifTool和其他查看工具的区别

操作系统自带的"右键属性"和看图软件也能显示一些基本信息,但这些工具通常只显示它们自己选择暴露出来的字段,升级了 UI 也不一定升级字段覆盖范围。ExifTool 是命令行工具,行为高度可控,输出格式可以自己选,能批量处理几百上千个文件,也能精确到修改某一个单独标签,而不动其他任何字节。

我经常用一句话形容这种工具:图形界面工具适合"看",命令行工具适合"算"。当你的需求是批量重命名、批量写版权、批量导出到数据库,这类机械性操作交给 ExifTool 这样可脚本化调用的工具,效率完全不在一个量级。

2. 装好它只需两分钟,但使用逻辑值得先想明白

ExifTool 是开源免费的,跨平台支持 Windows、macOS、Linux,也有对应的图形化扩展,但核心还是 Perl 写的命令行程序。安装这一步没什么难度,难的是思维上从"看图"切换到"操作字段"。

2.1 安装方式

在 Windows 系统上,我一般直接下载官方提供的 Windows 可执行压缩包,解压后把 exiftool.exe 放到一个固定目录,并把这个目录加入 PATH,这样在任意终端里都能调用。macOS 和 Linux 更简单,通过系统包管理器一条命令就能装好。装完打开终端输入exiftool -ver,能输出版本号就说明环境已经通了。

提示:如果你有多个版本混用的场景,建议用完整版本号定位问题。Exiftool 在不同大版本之间对某些私有标签的解析行为会有差异,我见过同一段命令在两个版本下输出字段名略有不同的情况。

2.2 先学会读:读取单张照片的完整源信息

最基本的用法就是直接跟文件路径。在终端执行:

exiftool IMG_001.jpg

这会输出一大串标签名: 值的明文结果,比如相机厂商、镜头型号、拍摄时间、GPS 坐标、缩略图信息等。如果文件没有任何元数据,输出会非常短,只有文件名、文件大小、文件类型这几项系统级标签,这些标签不是文件内部写的,而是 ExifTool 根据文件系统实时计算出来的。

读信息时,我强烈建议先看原始全量输出,不要一上来就用过滤条件,因为你根本不知道这个文件里有哪些字段。只有见过一次完整的样子,后面才知道该过滤哪些字段。

2.3 如何只提取自己关心的字段

当你已经知道目标字段名后,可以直接用-标签名来指定输出:

exiftool -DateTimeOriginal -Make -Model -ISO IMG_001.jpg

每个标签前面的前缀表示命名空间,比如EXIF:DateTimeOriginal、QuickTime:CreateDate。写全命名空间能避免歧义,因为同一个字段名在不同标准下不一定代表同一个时间。比如 JPEG 里常见CreateDate和DateTimeOriginal是两回事,前者是文件创建时间,后者是拍摄瞬间的时间,两者可能相差好几天。

如果你只是想看这个文件支持哪些标签,可以加-s参数,比如exiftool -s IMG_001.jpg,它会输出短字段名,方便后续脚本直接引用。

2.4 输出格式:JSON、CSV、纯文本怎么选

单文件看纯文本没问题,批量处理时纯文本就难整理,所以 ExifTool 提供了多种输出格式:

exiftool -j -- lat long image.jpg exiftool -csv *.jpg > metadata.csv

-j输出 JSON,适合丢给 Python、Node 等程序继续处理。-csv输出表格结构,适合直接导入 Excel 做交接和归档。实际项目里我经常先用 CSV 导出全量字段,再在表格工具里做透视,这样能快速发现一批素材里哪些文件缺少关键标签、哪些文件时间不对、哪些文件 GPS 是空的。

还有-p参数可以自定义输出模板,比如只打印日期和文件名:

exiftool -p '${DateTimeOriginal} ${FileName}' *.jpg

这在写自动化脚本时特别好用,比先导出 CSV 再二次处理更直接。

3. 真正干活时的高频操作:批量重命名、整理与写入

读信息只是第一步,日常用得最多的其实是批量写入和批量改名。我接手过很多摄影素材归档项目,核心需求几乎都一样:把零散命名的一堆文件,按拍摄时间重新命名,同时把作者、版权、关键词这些基础字段统一写进去。

3.1 按拍摄时间批量重命名

假设你有一个目录全是 JPG,想把文件名改成20250120_153000这种格式,可以这样操作:

exiftool '-FileName<DateTimeOriginal' -d '%Y%m%d_%H%M%S%%-c.%%e' ./素材目录

解释一下这行命令的逻辑:-FileName<DateTimeOriginal表示把DateTimeOriginal的值作为新文件名的来源;后面的-d是日期格式模板;%%-c表示如果目标文件名已经存在,就自动追加序号避免覆盖;%%e代表原始扩展名。这个用法几乎是图片素材归档的标配。

如果你有 RAW 文件和对应的 JPG 同在一个目录,用上面这条命令就会出现两个文件重名的情况,因为它们的 DateTimeOriginal 通常一样。这时候需要先按扩展名区分批次,或者用%f保留原文件名前缀再加日期后缀,比如%f_%Y%m%d_%H%M%S,这样既能保留原始序号又不会冲突。

3.2 批量写入版权与作者信息

发布到个人作品集或者委托拍摄的照片,最好在一开始就写入作者和版权信息,避免后续一张张补。我自己一般用三条一起写:

exiftool -Artist="某开发者" -Copyright="Copyright 2025 某开发者" -ImageDescription="个人摄影作品集" *.jpg

写完以后可以用读信息确认一下,确保每个文件的Artist和Copyright都覆盖到了。需要注意的是,很多看图软件只看 XMP 里的Creator而不看 EXIF 里的Artist,所以如果希望更通用,最好多个标准一起写:

exiftool -Artist="某开发者" -Copyright="Copyright 2025" -XMP-dc:Creator="某开发者" -XMP-dc:Rights="Copyright 2025" *.jpg

如果只用 EXIF 字段,在某些平台上可能显示不出来,这一点在给图库供图时尤其吃亏。

3.3 整批照片的GPS坐标补齐

有些老相机或者关闭了定位的手机拍出来的照片没有 GPS 字段,但你可能希望用行车记录仪或者手机轨迹补上坐标。ExifTool 可以直接写入 GPS 标签,接受十进制格式,也接受度分秒格式:

exiftool -GPSLatitude=39.9042 -GPSLongitude=116.4074 -GPSLatitudeRef=N -GPSLongitudeRef=E image.jpg

如果你有某条轨迹的起点和终点坐标,想给一批照片统一写入同一个 GPS 坐标,也可以循环遍历。更高级的玩法是把 GPS 轨迹文件里的时间点和照片时间做匹配,按秒差值插值出每张照片的坐标,这需要先解析轨迹文件,再把结果喂给 ExifTool,可以做成一个小脚本。但这里有个前提:照片自身时间必须准确,否则坐标会全部偏移,这点在长途旅行时尤其明显。

3.4 从一张图复制元数据到另一张图

有时候你拍了一组连拍,只有其中一张被后期软件处理过,其他原图还保留着最完整的信息。如果希望后期图保留原图的全部元数据,可以直接用-TagsFromFile复制:

exiftool -TagsFromFile 原图.jpg -all:all 处理后的图.jpg

从原图复制所有标签到处理后的图,默认会备份处理后的图,需要配合-overwrite_original才会直接覆盖,不过这个参数要慎用。实际工作中更常见的用法是只复制特定字段,比如从 RAW 文件把时间、相机参数、GPS 复制到导出的 JPG:

exiftool -TagsFromFile RAW文件.CR3 '-DateTimeOriginal' '-GPSLatitude' '-GPSLongitude' 导出文件.jpg

这样能避免把 RAW 里特有的私有 MakerNotes 复制到 JPG 上造成兼容性问题。

3.5 日期归档脚本的思路

如果是长期累积的照片,我习惯按年/月/日目录结构归档。核心逻辑是先读取每张照片的 DateTimeOriginal,再让 ExifTool 生成目标路径:

exiftool '-Directory<DateTimeOriginal' -d './归档/%Y/%m/%d' *.jpg

-Directory<DateTimeOriginal表示目标目录由日期来决定,配合-d模板就能自动创建对应文件夹并移动文件。这个命令特别适合把手机里攒了好几年的照片一次性按时间摊开。执行前建议先加-dry-run或-test参数预览一遍,ExifTool 支持这两个参数,会显示将要执行的操作而不实际改动,这是大规模操作前最安全的习惯。

4. 视频文件没你想的那么简单:解析MP4/MOV里的隐藏信息

静态照片的元数据已经够复杂了,视频文件的信息层级要多得多。ExifTool 对视频的支持不是蜻蜓点水,它能深入容器内部,读取不同轨道各自的属性,还能把每个时间片段里的嵌入式数据提取出来。

4.1 视频里能读到哪些源信息

一段手机拍的 MP4,用 ExifTool 读取后可以拿到:

  • 容器信息:文件格式、时长、文件大小、总比特率
  • 视频轨:编码格式、分辨率、帧率、显示宽高比、码率
  • 音频轨:音频编码、采样率、声道数量、语言代码
  • 拍摄信息:录制设备型号、创建时间、位置信息
  • 编码器信息:软件名称、编码参数版本

这些信息对剪辑工作流特别有价值。比如你从甲方那边收到几十个素材片段,想确认哪些是 4K 哪些是 1080P、哪些是 H.264 哪些是 HEVC,不需要逐个拖进剪辑软件,一条命令就能列出来:

exiftool -csv -VideoFrameRate -VideoCodecType -ImageWidth -ImageHeight *.mp4

4.2 用 -ee 展开每一个时间片段

视频文件里面的元数据不只在文件头,有些设备会在视频流内部按固定间隔写入信息,比如运动相机每一段录制的状态数据、经纬度坐标、速度等。默认情况下 ExifTool 只读取文件头部的主要标签,这些嵌入式数据需要加-ee参数才能完整提取:

exiftool -ee -api QuickTimeUTC=1 运动视频.mp4

-ee全称是"extract embedded information",它会把视频流中重复出现的元数据逐段展开。展开之后你会发现原本只有几条记录的结果,变成了几十条甚至上百条,每条对应不同的时间区间,这在分析潜水、骑行、飞行轨迹时非常有用。

不过要提醒一句,-ee的输出会让普通读信息的命令变得非常长,所以日常归档不需要加这个参数,只有明确要提取嵌入式 GPS 或状态数据时才用。

4.3 视频元数据的时区陷阱

视频文件的时间字段和照片不太一样。QuickTime 容器里的CreateDate和ModifyDate通常以 UTC 时间存储,而很多播放器为了方便显示,会自动加本地时区。如果你直接用 ExifTool 读,看到的时间可能和拍摄软件显示的时间差了好几个小时。

这种情况下我建议统一加一个参数:

exiftool -api QuickTimeUTC=1 video.mp4

-api QuickTimeUTC=1表示把 QuickTime 的 UTC 时间自动转成本地时区来显示。批量对比视频与照片拍摄时间时,这个参数非常重要,否则你最后排出来的时间线会错乱。

5. 我踩过的坑和绕开它们的办法

工具再好用,坑也少不了。下面这几条是我实际使用中反复踩过的,写出来供参考。每个坑背后都有对应的原因和解决方法,看了之后能帮你省不少排查时间。

5.1 中文信息乱码

写入中文关键词或者作者名时,最常见的结果是打开软件一看全是乱码。原因一般是字符编码不一致。有些设备写的是 GBK/GB2312,有些软件写的是 UTF-8,ExifTool 默认按一定规则去解码,遇到不匹配就会显示乱码。

解决办法是显式指定字符集:

exiftool -charset exif=UTF8 -charset iptc=UTF8 -Artist="某开发者" photo.jpg

如果文件里的中文已经乱掉了,先别急着覆盖。先用不同字符集参数去读,比如-charset exif=CP1252、-charset iptc=GBK等,多试几种组合,找到能正确显示的那次再考虑如何转存。这个过程中最重要的原则是:先读出正确数据,再重写文件,不要对着乱码猜。

5.2 日期和时间偏了8小时

处理一批素材时发现,所有照片的时间都比实际时间早了或晚了 8 个小时。这通常不是文件的问题,而是 ExifTool 根据系统时区换算时用了不同规则。照片里的DateTimeOriginal本身可能按本地时间存储,如果系统时区设置不对,输出就会偏。

对于已经偏了的文件,正确做法是先确认时区偏移标签是否存在,比如OffsetTimeOriginal。然后可以这样调整:

exiftool -DateTimeOriginal-="8:00:00" *.jpg

这表示对DateTimeOriginal做时间减法,往前调 8 小时。反过来用+=就是往后调。为了避免把方向搞反,建议先对单个文件做测试,读取确认无误后再对整批操作。

5.3 GPS坐标到底是哪种格式

ExifTool 默认读取 GPS 时输出度分秒格式,类似39 deg 54' 15.12" N。写入时很多人直接填了十进制的39.9042,结果读出来发现变成了奇怪的组合,这是因为没告诉它这是十进制格式。

写入十进制坐标时,我习惯这样写,避免歧义:

exiftool -GPSLatitude="39.9042" -GPSLongitude="116.4074" -GPSLatitudeRef="N" -GPSLongitudeRef="E" photo.jpg

可以加引号,让 ExifTool 明确参数边界。如果你拿到的是度分秒字符串,也可以写39 54 15.12这种带空格的格式,它同样能解析。批量补 GPS 前,先拿一张测试图读写一遍,确认输出不报错后再整批执行,这是最稳妥的流程。

5.4 overwrite_original 参数别乱用

ExifTool 默认修改文件前会复制一份原名加_original后缀的备份文件,这是它保护数据的方式。有的人为了省磁盘空间,喜欢加-overwrite_original,但一旦批量命令里写错了字段,原始文件就被覆盖了,想恢复都难。

我自己只在两种情况用-overwrite_original:一是面对大量临时文件且目标明确,二是处理完后马上有校对步骤。否则还是保留备份,等你验证一批没问题后再统一删除_original文件,这个习惯能救回不少意外。

5.5 递归处理时误伤非目标文件

递归参数-r很好用,但它会按扩展名匹配时忽略目录内所有文件,一不小心就会把隐藏在子目录里的视频文件也处理了。我建议在批量操作时主动限定扩展名:

exiftool -r -ext .jpg -ext .jpeg -tagsfromfile 参数 ./素材库

这样只处理 JPG 和 JPEG 两种格式,其他文件即使递归到也不会被改动。尤其是当前目录如果你混有输出文件,比如_original备份,也要考虑过滤掉,避免把备份文件也当成原始文件二次写入。

6. 分享图片前,记得先"撕掉"这些纸条(安全与隐私)

最后聊一个很多人容易忽略的点:源信息在帮助回溯拍摄参数的同时,也可能泄露隐私。照片里的 GPS 坐标、拍摄时间、设备序列号,都可能被有心人利用。在公开发布图片前,学会用 ExifTool 抹掉敏感信息,是每个素材处理者都应该掌握的基本操作。

6.1 一张分享出去的照片会暴露什么

你随手拍的一张家里照片,如果原图直接发到社交媒体,别人下载后通过源信息可能看到你的拍摄地点,甚至通过镜头序列号或相机序列号追踪到设备。视频文件也有类似风险,文件头里可能带有录制设备的序列号。这些信息平时你看不到,但它是真实存在于文件里的数据层。

尤其做图库、电商、自媒体的人,经常要传图片给外部合作方,如果合作方内部有合规审查要求,带 GPS 的照片可能直接导致审计问题。所以我处理对外素材的第一道工序,永远是清理源信息,再谈排版和发布。

6.2 一键清除源信息的正确姿势

ExifTool 清除所有元数据的命令非常简洁:

exiftool -all= -overwrite_original 要发布的图片.jpg

-all=的意思是清空所有可写的元数据组,执行后照片仍然可以打开,只是里面不再有 EXIF、IPTC、XMP 等标签。加-overwrite_original是为了避免留下一堆_original文件,因为这个场景下不需要备份原始文件。

批量清理时配合递归:

exiftool -all= -r -ext .jpg -ext .png ./待发布目录

执行完后可以挑几张重新读信息,确认GPSLatitude、DateTimeOriginal等字段已经消失。需要注意,清空后图片的"创建时间"原生信息也会消失,对个别平台的时间线展示可能有影响,取舍要自己判断。

6.3 只抹掉部分敏感字段

并不是每次都要清空全部元数据,很多时候你只是想去掉位置信息,但保留镜头参数和拍摄时间。可以单独删除 GPS 相关标签:

exiftool -GPSLatitude= -GPSLongitude= -GPSAltitude= -GPSLatitudeRef= -GPSLongitudeRef= -GPSAltitudeRef= photo.jpg

把要删除的标签值设为空,ExifTool 就会移除该标签。也可以按组删除,比如-gps:all=只清 GPS 组,-exif:all=只清 EXIF 组。我自己的习惯是先用-s列一下当前所有标签,再决定删哪一组,而不是凭记忆删除,这样更不容易漏掉字段。

我个人的经验是,照片的源信息既是一个高效整理素材的工具,也是一个需要随时警惕的隐私边界。学会用 ExifTool 读、写、删,不光是技术活儿,更是一套完整的数字资产管理思维。如果把它的各项参数吃透了,你会发现整理几十 GB 的素材根本不是体力活,而是一串命令反复执行完的流水线。希望这篇文章里的细节能帮你少走一些弯路。

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

机器学习音乐生成实战:LSTM钢琴曲自动生成毕设源码全解析

简介&#xff1a;一份基于机器学习的音乐自动生成软件设计与实现源码包&#xff0c;面向计算机、人工智能、自动化等专业的学生、老师或从业者&#xff0c;可用于毕业设计、课程大作业或期末项目参考。项目为个人高分毕设成果&#xff0c;答辩评审分达到95分&#xff0c;代码均…

作者头像 李华
网站建设 2026/10/12 5:53:46

Python+MySQL图书馆管理系统开发实战指南

简介&#xff1a;这是一套基于Python与MySQL开发的图形化界面图书馆管理系统源码&#xff0c;面向Python初学者与数据库应用开发者&#xff0c;解决图书信息管理、读者资料维护及借阅流程自动化等实际业务问题&#xff0c;适用于课程设计、毕业设计或小型机构内部管理系统搭建。…

作者头像 李华
网站建设 2026/10/12 5:52:03

工业PoE交换机选型与部署:从PoE供电原理到远距离传输故障排查

1. 为什么工业现场越来越离不开PoE交换机先讲一个我实际见过的场景&#xff1a;某自动化产线改造&#xff0c;现场要部署一批IP摄像机和无线AP。电工班老张跟我说&#xff0c;新设备装起来不难&#xff0c;难的是布线——摄像头装在钢梁上&#xff0c;附近根本没有电源插座&…

作者头像 李华
网站建设 2026/10/12 5:51:22

非Docker环境下手动安装视频标注工具VATIC全攻略

做视频数据集最大的痛点从来不是算法选型&#xff0c;而是标注。尤其是视频目标检测任务&#xff0c;动辄几千帧画面&#xff0c;一帧一帧画框能把人逼疯。我在2020年初接到一个内部项目&#xff0c;需要快速攒一批标注数据&#xff0c;专门去调研了一圈视频标注工具&#xff0…

作者头像 李华
网站建设 2026/10/12 5:51:04

中国省市区城市列表MySQL数据表:导入、转JSON与查询优化

简介&#xff1a;这是一份面向后端开发、数据分析与地图应用开发者的中国省市区城市列表MySQL数据表&#xff0c;以SQL脚本形式提供&#xff0c;可直接导入数据库&#xff0c;也可转换为JSON数据使用。数据覆盖全国省份、城市与区县&#xff0c;包含行政区划码和经纬度信息&…

作者头像 李华