画像の撮影日時を特定したい
画像データの撮影日時を特定しようとして、Exif撮影日時の取り扱いにちょっと悩んだ。
理解不足があるかもしれないけど、現時点で分かったことをメモしておく。
そもそもの要件として
- UIImagePickerControllerのカメラまたはフォトライブラリから画像を取得する。
- 撮影日時と撮影場所の座標を特定したい。
撮影場所の特定
カメラ撮影時
CLLocationManagerを使って現在位置(CLLocation)を取得する。
フォトライブラリ利用時
画像データの持つExif内のGPSデータを利用する。
撮影場所の取得については特に問題ないと思う。
それぞれGPS情報が得られない場合はどうするのかはまた別に考える。
撮影日時の特定
まず撮影日時として使えそうな値が3つほどある。
- GPS日付
- システム日付
- Exif撮影日時
それぞれの取得方法をざっくりまとめてみた。
GPS日付 | システム日付 | Exif撮影日時 | |
---|---|---|---|
カメラ撮影時 | CLLocation *location [location timestamp] (UTC) |
[NSDate date] (UTC) |
DatetimeOriginalタグ (タイムゾーンなしの現地時間) |
フォトライブラリ 利用時 |
Exifの GPSデータ DateStamp, TimeStamp (UTC) |
× | DatetimeOriginalタグ (タイムゾーンなしの現地時間) |
Exif撮影日時
本来、撮影日時といえばこのExifのDatetimeOriginalなんだろう。
でもこいつはタイムゾーンを持っていないという問題がある。
例えば、iPhone端末を持って国外へ行き、現地でタイムゾーン情報を取得した以降に撮影した写真の日時は現地時間となる。
東へ向かって旅行してタイムゾーンを跨ぐと、後に撮影した写真の日時が先の写真よりも前になる。
GPS情報が記録されていれば、タイムゾーンを判定してUTCへと変換することはできるかもしれない。
しかし、撮影日時は必ず現地のタイムゾーンで記録されてるんだろうか?
GPSは現地の位置で記録されていて、撮影日時は出発地点のタイムゾーンのまま記録されてしまっていた、ということはないんだろうか?
という疑問について、Exif情報への理解不足から確信がもてない。
システム日付
システム日付はフォトライブラリ利用時は意味が無いので使えない。
カメラ撮影時は別に使っても良いけど。
GPS日付
要件上、カメラ撮影時は撮影場所を特定するためにGPS情報を取得しているので、GPS日付は使用できる。
フォトライブラリ利用時は、GPS情報が記録されている画像を使用することが前提にはなるが、GPS日付を使用できる。
実はこのGPS日付もタイムゾーンを持っていないが、UTCということを前提に扱う。
現時点での結論
いろいろ理解不足な面があるので確信もてないところもあるが、写真画像データに関する仕様上、安定して使える日付情報は今のところないように見える。
とりあえず、現時点ではGPS日付を使って撮影日時を特定するのが最適だと判断。
参考
Exchangeable image file format
Get EXIF data of a particular image/photo in cameraroll