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 の役目は終わりです。新しいライブラリで何枚か確認してから削除してください。