Google Photos 以相册形式去管理,你会通过自带的 Album 功能,把相关的照片放在同一个相册下。
你将遇到三个问题:
- 重复
- Meta 弄乱
- 照片 Meta 文件不见了
重复例如,去天津旅游,就建一个「天津」,把相关的照片放一起。问题是,谷歌同样把你的照片都放在一个个以日期为名的相册里。我 10 月 10 日去的天津,拍了张food.jpg
,旅程结束后,我把这张照片以及其他沿途拍的放在「天津之旅」相册中。此时food.jpg
出现在了两个文件夹里:. ├── 2020-10-10 │ ├── food.jpg ├── 天津之旅 │ ├── food.jpg
所以将所有照片导出的时候,你会有两张一样的照片。
Meta 被移除
使用官方工具 Google Takeout 导出所有照片时,照片的 Exif 数据被移除,并放到一个额外的 JSON 文件里。以上面的例子,导出 2020-10-10 的照片,会得到
.jpg
和.json
:. ├── 2020-10-10 │ ├── food.jpg │ ├── food.jpg.json │ ├── metadata.json
JPG 和 JSON 一般以成双出现,有的时候 JSON 命名为
文件名.扩展.json
(上面的例子),有的时候则是文件名.json
。每一个相册,还会有一份metadata.json
,记录相册的 metadata。谷歌把每一张照片原本的 Exif 数据(e.g. 地点、日期)抹掉,放到对应的 JSON 里。
{ "title": "IMG_7545.HEIC", "description": "", "imageViews": "0", "creationTime": { "timestamp": "158202xxxx", "formatted": "18 Feb 2020, 10:35:07 UTC" }, "modificationTime": { "timestamp": "158362xxxx", "formatted": "8 Mar 2020, 00:50:35 UTC" }, "geoData": { "latitude": 25.382409333333334, "longitude": 169.39753444444445, "altitude": 78.39409156147392, "latitudeSpan": 0.0, "longitudeSpan": 0.0 }, "geoDataExif": { "latitude": 22.242533333333334, "longitude": 114.15739444444445, "altitude": 80.11492156147392, "latitudeSpan": 0.0, "longitudeSpan": 0.0 }, "photoTakenTime": { "timestamp": "1581511593", "formatted": "12 Feb 2020, 12:46:33 UTC" } }
如果不管 JSON 直接导入到新的照片服务,你照片会没有日期、地点,时间次序是错的。
注:有些照片我的 Exif 丢了,有些照片则没丢。可能和是否使用原图上传的设置有关,可能压缩后,就会把原本的 Exif 移除掉,变成 JSON。
JSON 并非一一对应
导出后,JSON 并不一定有与之一一对应的照片。有可能有照片,却不见了 JSON;也可能有 JSON,却没找到照片。
Google Takeout 在导出照片时,会把所有数据根据总体大小切割成一份份
.zip
文件,有可能在分割的过程里,JSON 和照片归在不同的 ZIP 中。解压后,自然在不同文件夹。导出方法
我摸索后,发现有两种方法:
- 先导出,后处理
- 先处理,后导出(我的做法)
第一个方法,偏技术性,需要用到命令行。第二个方法是我用的方法,比较简单,不过重复性的动作较多。
无论前者还是后者,你都需要从 Google Takeout 导出数据:
- 去 Google Takeout
- 选取需要的相册后,导出
- 下载解压
先导出,后处理(第一个方法)
(当时进行迁移时,网上还没有那么多关于 Google Photos 导出教程,所以我自己并没有使用这个方法。)
简介:在 Google Takeout 一键导出,然后治理照片重复以及 Exif 问题。这需要使用第三方开源工具 ExifTool,将 JSON 里的信息再次转换为图片的 Exif。
先导出
Google Takeout 导出时,应该全选所有相册,避免有漏掉的照片。下载并解压后,得到庞大的文件数量,我四年的数据导出时生成了八万多个文件(照片、视频、JSON)。
├── 2018-05-27-28 │ ├── IMG_20180528_122431.jpg │ ├── IMG_20180528_122431.jpg.json │ ├── IMG_20180528_132828.jpg │ ├── IMG_20180528_132828.jpg.json ├── 2019-06-29 │ ├── IMG_20190629_161802.jpg.json │ ├── IMG_20190629_161804.jpg.json │ ├── IMG_20190629_161809_Bokeh.jpg.json
能看到有些文件夹(e.g.
2019-06-29
)只有 JSON,而没有与之对应的照片。接下来,把 JSON 里的内容合成到原本照片里。后处理
首先,安装免费开源工具 ExifTool,支持 Windows、macOS 和 Linux。macOS 用户可以使用 Homebrew 下载
brew install exiftool
。我们通过这个工具来对照片的 Exif 进行读写,将 JSON 信息抽取出来,写到 Exif 中。
用到的命令如下,按需修改。
如果文件名为
文件名.扩展.json
,使用的代码格式为:exiftool -tagsfromfile '%d/%F.json' '-ImageTag<JsonTag' FileOrDir
否则,文件名为
文件名.json
,则使用:exiftool -tagsfromfile '%d/%f.json' '-ImageTag<JsonTag' FileOrDir
替换
FileOrDir
成你的目标位置(或文件);替换ImageTag
成 Exif 定义的标签;替换JsonTag
为 JSON 文件中的标签。例如:ImageTag JsonTag 一对 ImageDescription Description '-ImageDescription<Description'
DateTimeOriginal PhotoTakenTimeTimestamp '-DateTimeOriginal<PhotoTakenTimeTimestamp'
注意:谷歌不断更改 JSON 里标签的命名方法,请查看 Google Takeout 导出 JSON 中标签的最新命名方法,记得更改对应的 JsonTag。
使用一条命令循环所有子目录,读取根目录下所有文件和子目录中的文件 JSON 中不同标签:
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 "*" -overwrite_original -progress --ext json FileOrDir
-r
循环子目录-ext "*"
表明包含所有文件类型,可以改成-ext "jpg"
或者-ext "mp4"
限定修改特定文件类型--ext "json"
表明剔除类型为 JSON 的文件- 读者如果需要更多关于工具的操作方法,可以参考 ExifTool 的指令文档
这会更改所有照片的 Exif,记得备份好原本下载的 ZIP。