🖼️

PNGファイルに撮影日時を埋め込みたくて苦労した話

2025/01/24に公開

あらすじ

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形式でデータが格納されることが多いようです。
iTXtチャンクの中身を示すスクリーンショット

ただこのXMLにタイムスタンプを記録している項目は見つかりませんでした。

tIMEチャンク

実はタイムスタンプ専用のチャンクが存在します。PS5のスクリーンショット機能で撮影した画像などはここにもタイムスタンプが記録されます。残念ながらこちらもGoogle Photosでは撮影日としては扱われませんでした....

eXIfチャンク

比較的最近拡張された仕様に含まれるチャンクです。JPEGなどと同様のEXIFデータが格納されます。exiftoolで以下のようにタイムスタンプを付与してみたところ、macOSのプレビューでもGoogle Photosでも撮影日として認識されました。

exiftool -DateTimeOriginal="2025:01:24 12:00:00" test.png

eXIfチャンクが2017年のPNGEXT 1.5.0で仕様となったことを示すページのスクリーンショット

このサイトの通り2017年のPNGEXT 1.5.0で制定されるなど割と新しい仕様であるためか、GoogleでこのチャンクやPNGのEXIFについて検索しても "新しいから普通の画像ビューワーだとタイムスタンプとして認識されない", "PNGにEXIFデータは埋め込めない"という結果が多々ヒットしますが、これは最近ではもう時代遅れな情報のようです。

結論

PNGファイルに撮影日時やその他EXIF情報を埋め込みたい場合eXIfチャンクを使いましょう。最近の画像ビューワーやギャラリーアプリ、Google Photosなどではちゃんと認識してくれます。

Discussion