Takeout JSON

Google Takeout でダウンロードした写真の日付がおかしい?撮影日が消える理由と戻し方

Google フォトを Google Takeout(データ エクスポート)で一括ダウンロードすると、すべての写真がダウンロード日になります。本当の撮影日がどこに隠れているのか、どの写真が影響を受けるのか、どうやって写真に書き戻すのかを説明します。

Google フォトのライブラリを Google Takeout(日本語の画面では「Google データ エクスポート」)でダウンロードし、zip を解凍してフォルダーを開いたところ、10 年分の写真がぜんぶ「先週の火曜日」に撮ったことになっている。日付順に並べ替えると、2012 年の海の写真と昨日のスクリーンショットが隣に並ぶ。よくある状況です。

何も失われてはいません。日付はちゃんと残っています。ただ、パソコンが見る場所にないだけです。

日付はどこへ行ったのか

写真の日付は 3 か所に保存されます。カメラはファイルの内側、EXIF という領域に「DateTimeOriginal(撮影日時)」として書き込みます。OS はファイルの外側に「作成日時」と「更新日時」を持っています。エクスプローラーや Finder、たいていの写真アプリは、まず EXIF を読み、EXIF がなければファイルの日時を使います。

Takeout はこれを二重に壊します。まず、Google が写真を zip にまとめる時点で、ファイルの日時は zip を作った瞬間、または解凍した瞬間になります。EXIF が無事なら、それだけなら問題になりません。

次に、かなりの割合の写真で EXIF の日付が欠けているか間違っています。スクリーンショットにはそもそも撮影日がありません。LINE などのメッセージアプリは送信時に圧縮し、メタデータを消します。スキャンした写真はスキャンした日になっています。そして Google フォトの中で日付を修正したことがあれば、その修正は Google のデータベースに保存されただけで、ファイルには書かれていません。Google は正しい情報を写真に書き戻す代わりに、写真の横に .json ファイルを置いて渡してきます。

パソコンはその .json を完全に無視します。だから、見つけられる唯一の日付、つまりダウンロード日を表示するのです。

どれくらい壊れているか確かめる

直す前に、実際に何枚が対象なのかを調べておくと無駄がありません。スマートフォンのカメラで撮った写真は、たいてい EXIF の撮影日が残っています。それが大半なら、直す必要があるのは一部だけです。

exiftool が入っていれば、次のコマンドで EXIF に撮影日がないファイルを一覧できます。

exiftool -r -if 'not $DateTimeOriginal' -filename "Takeout/Google Photos"

実際の 991 枚の Takeout パートで数えたところ、正しい日付の出どころが JSON しかない写真はおよそ 5 枚に 1 枚でした。割合はライブラリによって変わります。スクリーンショット、チャットの画像、古いスキャンが多いほど JSON への依存は大きくなります。

JSON ファイルを開いてみる

各写真には IMG_2034.JPG.supplemental-metadata.json のような相棒のファイルがあります(古いエクスポートでは IMG_2034.JPG.json)。メモ帳などのテキストエディターで開くと、大事な部分はこう書かれています。

"photoTakenTime": {
  "timestamp": "1563102330",
  "formatted": "Jul 14, 2019, 11:05:30 AM UTC"
}

この timestamp が本当の撮影日時で、1970 年 1 月 1 日からの秒数、UTC です。creationTime という項目もありますが、こちらは Google にアップロードした日時です。撮影日が欲しいなら photoTakenTime を使います。ファイル全体の中身は Google Takeout の JSON ファイルとは何か で解説しています。

手作業で直す

数枚なら手で直せます。Windows ではファイルを右クリックして「プロパティ」、「詳細」タブで「撮影日時」を編集します。Mac ではプレビューや「写真」アプリで日付を調整できます。ただ、50 枚もやれば別の方法が欲しくなります。

ライブラリ全体なら、多くの人が使うのは exiftool です。次の 1 コマンドで、各 JSON のタイムスタンプを写真の EXIF とファイル日時にコピーできます。

exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
  "-DateTimeOriginal<PhotoTakenTimeTimestamp" \
  "-FileCreateDate<PhotoTakenTimeTimestamp" \
  "-FileModifyDate<PhotoTakenTimeTimestamp" \
  -ext jpg -ext jpeg -overwrite_original "Takeout/Google Photos"

動くには動きますが、落とし穴があります。Google は JSON の名前を 46 文字で切り詰めるので、上のパターンでは拾えないファイルが出ます。重複ファイルの (1) は、写真名と JSON 名で付く位置が違います。動画は別のタグが必要です。HEIC と PNG は別に実行しなければなりません。すべて exiftool ガイド にまとめました。ターミナルに慣れているなら、GooglePhotosTakeoutHelper のような無料のコミュニティ製スクリプトも、この名前の問題を処理してくれます。

アプリで直す

コマンドラインに一晩使いたくないなら、Takeout JSON Metadata Fixer が同じことをデスクトップアプリとして行います。Windows、Mac、Linux で動き、画面は日本語です。

Takeout の zip か解凍済みフォルダーを指定します。アプリはすべての写真を JSON と突き合わせます。2024 年以降の supplemental-metadata 形式、切り詰められた名前、(1) 付きの重複も含みます。そして photoTakenTime を写真の EXIF に書き込み、ファイルの作成日時と更新日時も合わせます。JSON がない写真は EXIF の日付があればそれを保ち、なければファイル日時を使うので、日付なしの写真は出ません。

動画にも日付が入ります。MP4 や MOV のプレイヤーが読む場所に書き込みます。JSON に本物の座標があれば GPS も写真に戻します。撮影日でファイル名を付け直して年/月フォルダーに振り分けることもできますが、これは任意です。日付だけ直したいなら「名前をそのまま」と「フォルダーをそのまま」を選んでください。

何も書き込まずに結果だけ見せる「ドライラン」があります。最初の 1000 枚は無料で、19.99 米ドルの買い切りで制限がなくなります。すべてお使いのパソコンの中で動き、写真がアップロードされることはありません。

日付がファイルの中に入ってしまえば、その後どこへ持って行っても正しいままです。Apple の「写真」でも、NAS でも、Immich でも、USB メモリでも、新しいスマートフォンでも同じです。

よくある質問

時刻は日本時間になりますか?

JSON には UTC の正確な瞬間が入っています。ツールは EXIF に書き込むときにパソコンのタイムゾーンで現地時刻に変換します。EXIF 自体にはタイムゾーンがありません。東京で 11 時 5 分に撮った写真は、パソコンが日本時間なら 11:05 に、ニューヨーク時間なら前日の 22:05 になります。直す前に、パソコンのタイムゾーンを大半の写真を撮った場所に合わせてください。海外旅行の写真は数時間ずれることを受け入れるしかありません。

EXIF に書き込むと画質が落ちますか?

日付タグの書き込みで変わるのはメタデータの領域だけです。画像のピクセルには触れません。とはいえ、結果に満足するまで元の zip は残しておいてください。それはいずれにせよ良い習慣です。

なぜ一部の写真だけ日付が違うのですか?

もともと EXIF の撮影日がなかった写真だけが壊れるからです。カメラで撮った写真には普通あります。スクリーンショット、チャットの画像、スキャン、Google フォト内で日付を直したものは JSON に頼ります。

日付を直したあと JSON ファイルは削除していいですか?

はい。日付と GPS が写真に書き込まれれば、JSON の役目は終わりです。新しいライブラリで何枚か確認してから削除してください。