Takeout JSON
ZH

怎么把 Takeout 的 JSON 元数据合并进照片?六步做完

把 Google Takeout .json 附属文件里的拍摄日期和 GPS 写进照片文件本身,用 exiftool 手动做,或用桌面软件一次做完,最后再删掉 JSON。

你手上是一个照片文件夹,每张照片旁边都有一个 .json 文件,里面是它真实的拍摄日期和地点。照片本身显示的日期却是错的。你想把 .json 里的信息写进照片,然后把这些附属文件扔掉,留下一个普通的照片文件夹。

这件事有成熟的做法。下面讲手动怎么做,以及点一下怎么做。

「合并」到底是什么意思

JPEG、HEIC 和 PNG 文件里有一块叫 EXIF 的元数据。相机把拍摄时间写在 DateTimeOriginal 这个标签里,把 GPS 坐标写在 GPSLatitudeGPSLongitude 里。各个平台的相册软件读的都是这些标签。

Takeout 的附属文件装的是同样的信息,只是换了个容器。合并,就是从附属文件里读出 photoTakenTimegeoData,写进 EXIF 标签。顺便把文件的创建时间和修改时间也改掉,这样访达和文件资源管理器在不看 EXIF 的视图里也能排对。

视频没有 EXIF。它的日期存在 MP4 或 MOV 容器里,标签名是 CreateDate 之类。道理一样,只是标签名不同。

第一步:全部解压到同一个地方

Takeout 会把大的导出拆成好几个 zip。把它们全部解压到同一个上级文件夹里,让相册文件夹合并起来。一个相册可能跨两个 zip,一半照片和一半附属文件在一个包里,另一半在另一个包里;它们最后必须并排放在一起。分卷很多的话,看 Takeout 分卷 zip 怎么一次解压合并

第二步:搞清楚照片怎么找到自己的附属文件

附属文件的名字是照片名加一个后缀。2024 年以后的导出里,IMG_0042.JPG 对应 IMG_0042.JPG.supplemental-metadata.json,更早的导出里对应 IMG_0042.JPG.json

有两种情况会打破这个简单规则。第一,超过 46 个字符的文件名会被截断,后缀也跟着被截掉一截。第二,重名照片的序号放的位置不一样:IMG_0042(1).JPG 对应的是 IMG_0042.JPG.supplemental-metadata(1).json。你用的工具必须两种都能处理,否则它会不声不响地跳过这些文件。细节见 supplemental-metadata.json 详解

第三步:用 exiftool 合并

exiftool 免费,所有系统都能用。装好以后,在 Google Photos 文件夹里打开终端,运行:

exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
  "-DateTimeOriginal<PhotoTakenTimeTimestamp" \
  "-CreateDate<PhotoTakenTimeTimestamp" \
  "-FileCreateDate<PhotoTakenTimeTimestamp" \
  "-FileModifyDate<PhotoTakenTimeTimestamp" \
  "-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
  "-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \
  -ext jpg -ext jpeg -ext heic -ext png -overwrite_original .

它做的事:对每张图片,在同一个文件夹里找「同名加 .supplemental-metadata.json」的文件,把列出的字段复制过去。-d %s 告诉 exiftool 时间戳是从 1970 年起算的秒数。-overwrite_original 让它不给每个文件留一份备份。

"%d/%F.supplemental-metadata.json" 换成 "%d/%F.json" 再跑一遍,处理老格式的附属文件。然后给视频再跑一遍:

exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
  "-CreateDate<PhotoTakenTimeTimestamp" "-ModifyDate<PhotoTakenTimeTimestamp" \
  "-TrackCreateDate<PhotoTakenTimeTimestamp" "-MediaCreateDate<PhotoTakenTimeTimestamp" \
  "-FileModifyDate<PhotoTakenTimeTimestamp" \
  -ext mp4 -ext mov -overwrite_original .

更多命令和坑见 exiftool 修复指南

第四步:处理 exiftool 漏掉的

先数一数还剩多少:

exiftool -r -if 'not $DateTimeOriginal' -ext jpg -ext heic -ext png -filename .

列表里会有被截断的文件名、带 (1) 的重复照片,以及本来就没有附属文件的照片。截断的那些,可以写个小脚本,找名字是预期名字前缀的 .json。重复的那些要先改名,模式才能匹配上。十分钟的活就是在这一步变成一个晚上的,这也是 GooglePhotosTakeoutHelper 这类社区脚本存在的原因。它们免费,替你做配对,但要在终端里用。

还有一个坑:上面的 GPS 参数会把附属文件里表示「位置未知」的 0.0, 0.0 照写进照片。加上 -if '$GeoDataLatitude ne 0',不然就会有一堆照片出现在大西洋上。

第五步:换成用软件做

Takeout JSON Metadata Fixer 在一次运行里做完第一到第四步,支持 macOS、Windows 和 Linux,界面有简体中文。

选择 Takeout 的 zip 或解压后的文件夹。软件会用 Google 用过的每一种命名方式去给照片和视频配对附属文件,包括 46 个字符的截断和 (1) 序号。它把日期写进图片的 EXIF 和视频的容器,改好文件时间,只在坐标是真实的时候才写 GPS。没有附属文件的照片保留自己的 EXIF 日期,连 EXIF 都没有的用文件时间。

你可以就停在这里,选「保留文件名」和「保留我的文件夹」,拿回同一个文件夹,只是元数据对了。也可以同时按日期重命名,并整理进年/月文件夹。试运行会先把计划给你看,什么都不写。前 1000 张照片免费,不限数量一次性 19.99 美元。什么都不上传。

第六步:检查,再删附属文件

在相册软件里从不同年份各打开几张照片,确认日期。然后删掉 .json 文件。Mac 或 Linux 上,在文件夹里运行 find . -name "*.json" -delete。Windows 上,在文件夹里搜索 *.json,全选,删除。原始 zip 找个地方再留一个月,万一发现问题还能回头。删之前的注意事项见 Takeout 的 JSON 文件可以删除吗

常见问题

合并会降低画质吗?

不会。只重写元数据那一块,压缩过的像素数据按字节原样复制。见修改照片日期会降低画质吗

照片本来就有 EXIF 日期,和附属文件里的不一样,听谁的?

附属文件反映的是 Google 相册显示给你的日期,包括你手动改过的。大多数情况下你要的就是它。如果你从没在 Google 相册里改过日期,两者本来就是一样的。

为什么合并出来的时间差了几个小时?

附属文件的时间戳是 UTC。EXIF 没有时区,工具会按你电脑的时区换算。把电脑时区设成照片拍摄地的时区,或者接受这个偏差。详见照片时间差了几个小时怎么办

能只合并日期、不要 GPS 吗?

能。exiftool 命令里去掉 GPS 那几行就行。软件里,有 GPS 就会写;如果只是不想让地名出现在文件名里,选一个不带地点的命名模板。