PNGファイルに撮影日時を埋め込みたくて苦労した話
あらすじ
JPEGファイルにはEXIFが基本的に埋め込まれていてそれに撮影日時が保存されているため、画像ファイルのタイムスタンプがおかしくなって苦労することはまずありません。
しかしPNGだとそうも行かず、ファイルのコピーやアップロードなどでファイルシステム上でのタイムスタンプが変動してしまうと、それが撮影日時として扱われてしまい不都合が生じます。なんとかしてPNGファイルにタイムスタンプを埋め込もうと苦労した話です。
日時を埋め込む方法は実はたくさんある
PNGに日時を埋め込む方法は実は多数あります。
tEXt
チャンク
date:create
, date:modify
, date:timestamp
ImageMagickで何のメタデータもない画像ファイルを編集すると、ファイルシステム上でのタイムスタンプなどを元にこのtEXtチャンクが付与されます。
一見問題なさそうに見えますが、このチャンクはGoogle Photos上ではタイムスタンプとして扱われず、macOSのプレビューのインスペクターでも表示されませんでした。
Creation Time
このページやこのサイトなどで言及されているKeyですが、こちらもdate:create
同様Google Photosなどでは日時情報として認識されませんでした。
iTXt
チャンク
tEXt
チャンクの国際版としてiTXt
チャンクなるものがあるようです。
本来はtEXt
チャンク同様に扱われるそうですが、XML:com.adobe.xmp
というKeyにXML形式でデータが格納されることが多いようです。
ただこのXMLにタイムスタンプを記録している項目は見つかりませんでした。
tIME
チャンク
実はタイムスタンプ専用のチャンクが存在します。PS5のスクリーンショット機能で撮影した画像などはここにもタイムスタンプが記録されます。残念ながらこちらもGoogle Photosでは撮影日としては扱われませんでした....
eXIf
チャンク
比較的最近拡張された仕様に含まれるチャンクです。JPEGなどと同様のEXIFデータが格納されます。exiftool
で以下のようにタイムスタンプを付与してみたところ、macOSのプレビューでもGoogle Photosでも撮影日として認識されました。
exiftool -DateTimeOriginal="2025:01:24 12:00:00" test.png
このサイトの通り2017年のPNGEXT 1.5.0で制定されるなど割と新しい仕様であるためか、GoogleでこのチャンクやPNGのEXIFについて検索しても "新しいから普通の画像ビューワーだとタイムスタンプとして認識されない", "PNGにEXIFデータは埋め込めない"という結果が多々ヒットしますが、これは最近ではもう時代遅れな情報のようです。
結論
PNGファイルに撮影日時やその他EXIF情報を埋め込みたい場合eXIfチャンクを使いましょう。最近の画像ビューワーやギャラリーアプリ、Google Photosなどではちゃんと認識してくれます。
Discussion