使用ExifTool获取、写入以及修改图片的exif信息

date
Feb 13, 2022
slug
exiftool
status
Published
tags
Life
summary
ExifTool 是一个可以获取、写入以及修改文件原数据的命令行工具
type
Post
Year
2022
 

ExifTool 是一个可以获取、写入以及修改文件原数据的命令行工具,使用Perl编写实现。支持的文件格式以及对应的原数据格式可以从这里查看。Mac用户可以使用 brew install exiftool 来安装ExifTool。下面来介绍一下常见用法:

查看信息

 

浏览一张图片的全部信息

❯ exiftool 20180723-154451-00.jpeg

ExifTool Version Number         : 12.30
File Name                       : 20180723-154451-00.jpeg
Directory                       : .
File Size                       : 2.3 MiB
File Modification Date/Time     : 2018:07:23 15:44:51+08:00
File Access Date/Time           : 2022:02:12 19:15:33+08:00
File Inode Change Date/Time     : 2022:02:12 19:13:16+08:00
File Permissions                : -rw-------
// ...
// 省略结果
 

通过加上参数,可以浏览一张图片的指定 EXIF 属性

参数的名称通常是属性名本身去掉空格。(大小写不敏感)
// 浏览图片的原拍摄时间
❯ exiftool -datetimeoriginal 20180723-154451-00.jpeg

Date/Time Original              : 2018:07:23 15:44:51


// 浏览图片的iso和文件大小(多个参数)
❯ exiftool -iso -imagesize 20171110-003317-00.jpeg

ISO                             : 2500
Image Size                      : 6000x3368
 

通过输入目录名,还可以查看多个文件的信息(支持通配符)

❯ exiftool -imagesize -datetimeoriginal pics
======== pics/20180915-223952-00.jpeg
Image Size                      : 155x140
Date/Time Original              : 2018:09:15 22:39:52+08:00
======== pics/20180925-151545-00.jpeg
Image Size                      : 3264x2448
Date/Time Original              : 2018:09:25 15:15:45
======== pics/20180123-125103-00.jpeg
Image Size                      : 6000x4000
Date/Time Original              : 2018:01:23 12:51:03
======== pics/20180123-125956-00.jpeg
Image Size                      : 6000x4000
Date/Time Original              : 2018:01:23 12:59:56
    1 directories scanned
    4 image files read

修改信息

所有对元信息的修改都会产生一个「_original」的备份文件,可以通过加上「-overwrite_original」参数来阻止这一行为。
 

参数后加入「=」等符号,即可修改文件的某个元信息

❯ exiftool -iso IMG_0894.JPG

ISO                             : 80


❯ exiftool -iso=100 IMG_0894.JPG

    1 image files updated


❯ exiftool -iso IMG_0894.JPG 

ISO                             : 100
 

参数后面加入「+=」或「-=」对数据进行增加或减少

❯ exiftool -DateTimeOriginal 20180123-125103-00.jpeg
Date/Time Original              : 2018:01:23 12:51:03

❯ exiftool -DateTimeOriginal+="00:01:03 10:0:0" 20180123-125103-00.jpeg
    1 image files updated

❯ exiftool -DateTimeOriginal 20180123-125103-00.jpeg
Date/Time Original              : 2018:02:26 22:51:03
 

还可以用「<」来通过某个参数来设置信息

此时需要用单引号包括整个参数
  1. 用图片尺寸(imagesize)来设置文件名(filename):
    1. // %f为文件原名,%e 为文件的扩展名,$imagesize表示读取-imagesize这个参数的结果
      ❯ exiftool '-filename<%f_$imagesize.%e' 20180123-125103-00.jpeg
      
          1 image files updated
      
      ❯ ls
      20180123-125103-00.jpeg_original 20180123-125103-00_6000x4000.jpeg
  1. 将批量文件的文件名中时间信息导入到 DateTimeOriginal 属性
    1. ❯ exiftool -filename -DateTimeOriginal *.jpeg
      ======== 20180123-125956-00.jpeg
      File Name                       : 20180123-125956-00.jpeg
      ======== 20180915-223952-00.jpeg
      File Name                       : 20180915-223952-00.jpeg
      ======== 20180925-151545-00.jpeg
      File Name                       : 20180925-151545-00.jpeg
          3 image files read
      
      ❯ exiftool '-DateTimeOriginal<filename' *.jpeg
          3 image files updated
      
      ❯ exiftool -filename -DateTimeOriginal *.jpeg
      ======== 20180123-125956-00.jpeg
      File Name                       : 20180123-125956-00.jpeg
      Date/Time Original              : 2018:01:23 12:59:56
      ======== 20180915-223952-00.jpeg
      File Name                       : 20180915-223952-00.jpeg
      Date/Time Original              : 2018:09:15 22:39:52
      ======== 20180925-151545-00.jpeg
      File Name                       : 20180925-151545-00.jpeg
      Date/Time Original              : 2018:09:25 15:15:45
          3 image files read

Case

修改相片在电脑上显示的创建时间为相片的拍摄时间

我今天从阿里云盘上下载了我之前的照片文件到本地,却发现照片的在文件在Finder中的「创建时间」是下载完成的时间戳。这些照片在PhotoPrism、ACDSee等应用中均能识别「拍摄时间」(即原创建时间),唯独在Apple Photos中会把照片文件在Finder中的创建时间当作照片的拍摄时间。此时,我们可以用ExifTool 来对这些照片在Finder中的创建时间修改成照片的拍摄时间。
for i in *.jpeg
do
	touch -t `exiftool -s -s -s -d "%Y%m%d%H%M.%S" -DateTimeOriginal $i` $i
done
上面的代码表示,对于当前文件夹的所有.jpeg文件,将会进行以下操作。 touch -t sometime file 表示将file的创建时间以及修改时间改为sometime。 exiftool -s -s -s -d "%Y%m%d%H%M.%S" -DateTimeOriginal file 这个命令会将file的原创建时间以特定的格式输出为sometime。
❯ exiftool -DateTimeOriginal test.jpeg
Date/Time Original              : 2019:11:09 15:32:07

❯ exiftool -s -s -s -d "%Y%m%d%H%M.%S" -DateTimeOriginal test.jpeg
201911091532.07
 

将相片的名称改为相片的拍摄时间

❯ exiftool -d '%Y%m%d-%H%M%S%%-03.c.%%e' '-filename<DateTimeOriginal' .
-d 告诉exiftool日期的格式,即'%Y%m%d-%H%M%S%%-03.c.%%e',其中%%-03.c代表三位 copy number02是两位,04是四位,以此类推)。Copy number的重要性稍后再说。
'-filename<DateTimeOriginal'则会读取DataTimeOriginal这个field中的数据,然后转换成前一个参数表达的格式,最后将其做为照片的文件名。 . 表示此命令的执行范围是当前文件夹。
 
Copy number常在由于相机的时间精度不够导致不同照片的年月日时分秒相同的情况下使用,这样照片就不会被拥有相同时间戳的其他照片覆盖。例如照片A、B和C均拍摄于20191109-153207,如果没有copy number,那么三张照片只会保留一张。当加入了copy number,三张照片的文件名将会是 20191109-153207-000.jpeg, 20191109-153207-001.jpeg20191109-153207-002.jpeg

© wongchihaul 2021 - 2024