批量加入 json 和来自 Google 的 jpg 外卖

bulk join json with jpg from Google Takeout

我想留下 Google 张照片,我已经使用 Google 外卖下载了我所有的照片。现在我有一大堆包含 json 文件(我认为包含 exif 数据)和图像的文件夹。结构如下所示:home/user/Billeder/Takeout/Google Photos/2011-06-09/file.json。 home/user/Billeder/Takeout(2)/Google Photos/2011-07-09/file.json.

我想将 json 数据与正确的图像结合起来,并将图像组织到与其创建日期相对应的文件夹中。 我一直在查看 Exiftool,但到目前为止找到的所有答案都只说明了如何对单个图像执行此操作。我正在寻找的是一种将所有数据与正确图像批量合并的方法。

我正在尝试在 linux 命令行中执行此操作。 有办法吗?

从版本 10.47 开始,Exiftool 现在可以执行此操作。

在我的测试中,我发现 json 文件名有两种不同的格式,有些是 filename.ext.json ,有些是 filename.json (没有扩展名 json 文件名)。这里有两个命令来涵盖这两种情况。如果你像我一样有混合物,运行两者都有。

文件扩展名为 json 文件名
exiftool -tagsfromfile '%d/%F.json' '-ImageTag<JsonTag' FileOrDir

json 文件名中没有扩展名的文件
exiftool -tagsfromfile '%d/%f.json' '-ImageTag<JsonTag' FileOrDir

FileOrDir替换为您要处理的文件或目录。将 ImageTag 替换为您要复制到的图像中的标签名称。将 JsonTag 替换为您要从中复制的 json 文件中的标签名称。如果您使用 Windows 而不是 linux,请使用双引号而不是单引号。

以下是我在 json 文件中遇到的一些更有用的标签,以及我在何处复制它们的建议。其中两个标签名称 Description 和 Title 与相关的 XMP 标签相同,因此无需将它们重定向到图像标签名称中,只需保留 -Description-Title在上面的命令中。
描述:文件的描述。合适的位置是 IPTC:Caption-Abstract、XMP:Description 和 EXIF:ImageDescription。您可以使用 '-Caption-Abstract<Description'-Description'-ImageDescription<Description'.
复制这些 title: 上传文件的名称。这可以复制到 TitleObjectDescriptionPreservedFileName.
people:不确定,但我猜测如果该文件在 Picasa 等程序中标记了人员,这将是姓名列表,很可能来自 RegionPersonDisplayName.
url: 这是一个可以下载图片的URL。警告:这是公开共享的 URL,即使图像被标记为私有,仍然可以使用此 URL.
下载 GeoInfoAltitude_GeoInfoLatitude_GeoInfoLongitude_:如果上传的文件带有地理标记,这些将是海拔高度,图像的纬度和经度。最好将这些复制到 GPSAltitudeGPSLatitudeGPSLatitudeRefGPSLongitudeGPSLongitudeRef。由于 GPS 标签(无符号)的性质,位于西 and/or 南半球 的图像必须 也必须设置 Ref 标签。

示例命令:
复制 gps 标签
exiftool -tagsfromfile '%d/%F.json' '-GPSAltitude<GeoDataAltitude' '-GPSLatitude<GeoDataLatitude' '-GPSLatitudeRef<GeoDataLatitude' '-GPSLongitude<GeoDataLongitude' '-GPSLongitudeRef<GeoDataLongitude' FileOrDir

复制关键词:
exiftool -tagsfromfile '%d/%F.json' '-Keywords<Tags' '-Subject<Tags' FileOrDir

复制说明:
exiftool -tagsfromfile '%d/%F.json' '-Caption-Abstract<Description' '-ImageDescription<Description' -Description FileOrDir

将JSON的所有数据复制到文件中,修改原文件(2020):

exiftool -r -d %s -tagsfromfile "%d/%F.json" "-GPSAltitude<GeoDataAltitude" "-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" "-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" "-Keywords<Tags" "-Subject<Tags" "-Caption-Abstract<Description" "-ImageDescription<Description" "-DateTimeOriginal<PhotoTakenTimeTimestamp" -ext jpg -overwrite_original FileOrDir

编辑(2018 年 1 月):一如既往,Google 将改变一切。根据下面的评论,上面的 GeoInfo* 标签已被弃用,并已被 GeoDataAltitudeGeoDataLatitude 取代, 和 GeoDataLongitude.

编辑(2020 年 10 月):更新 2020 年命令 JSON 格式

Exiftool 可以读取 Json 个文件,所以如果有其他变化,运行ning 命令 exiftool -s FILE.Json 将列出所有可以复制的标签和可用数据。

我的导出包含多个文件名有问题的文件:(exiftool 找不到这些文件)

  • IMG-20191102-WA0011(1).jpg
  • IMG-20191102-WA0011.jpg(1).json

json 文件实际上应该是:

  • IMG-20191102-WA0011(1).jpg
  • IMG-20191102-WA0011(1).jpg.json

以下脚本生成正确的文件并随后调用 exiftool:

https://github.com/jeroendoggen/scripts-tools-misc/blob/master/jsonmerge/json_merge.py

正如 Pieter 提到的那样,作为 2020 年 12 月的更新,我花了大约 5 分钟的时间设置了一个专用工具:https://github.com/mattwilson1024/google-photos-exif

但是,这并没有解决其他答案中提到的问题(PHOTO_NAME(1).jpgPHOTO_NAME.jpg(1).json 混淆)以及时区。更重要的是,none 此处的答案会覆盖 QuickTime 和 PNG 特定的标签。

我发现这个软件 https://metadatafixer.com/ 更简单。虽然要花钱,但还是值得的。

我在这里分享我最终使用的东西

https://gist.github.com/tetebueno/5800504133709c9844bcd1779019d390

此代码无法解决的唯一情况是文件名称很长(超过 46 个字符 (?))并且具有自动照片后缀之一(-edited,等等。 ), 因为这最终会是这样的:

very_large_file_name_..._foo-edited.jpg -> very_large_file_name_..._foo-edi.json