※ ここではSwiftをMac上でCLIプログラムとして書いています。iOS向けは一部読み替えが必要かもしれません。
※ Swift4です。
やること
- 画像を読み込み、Exifデータを得る。
- Exifデータから作成日時を取り出す。
- 作成日時をDateオブジェクトに変換する。
手順
1. 画像を読み込み、Exifデータを得る。
画像の読み込みには、CIImageを使います。
また、Exifデータは properties
プロパティの {Exif}
という謎のキーに入っています。(kCGImagePropertyExifDictionary
という定数が用意されているようです。)
けっこうキャストが必要で面倒です。
// load image.
let path = "/foo/bar";
let url = URL(fileURLWithPath: path);
let image = CIImage(contentsOf: url);
// get exif
let properties: [String: Any] = image.properties;
let exif = properties["{Exif}"] as! [String: Any];
2. Exifデータから作成日時を取り出す。
exif
から作成日時を取り出します。
CGImage用の定数文字列が定義されているので、使います。
let dateTimeOriginal = exif[kCGImagePropertyExifDateTimeOriginal as String] as! String; // -> 2018:10:31 10:21:36
3. 作成日時をDateオブジェクトに変換する。
テキストが得られましたが、これではまだ「いつ」なのかをプログラムで知ることが難しいため、Dateオブジェクトに変換します。
変換については【Swift】Dateの王道 【日付】というQiitaの記事が大変詳しいですが、一部引っかかるところがあると思うので、そこだけ書いておきます。
日時の文字列からDateオブジェクトを得るには、DateFormatterを使います。
DateFormatterはDateオブジェクトからTimeZone, Locale, フォーマットなどをもとに日時文字列を出力したり、逆に任意のフォーマットの日時文字列からDateオブジェクトを得たりできるクラスです。
なお、いろいろ試してみた結果として、どうやらタイムゾーンは考慮されないようなので、指定しても意味ないっぽいです。
出力にだけ関係あるのかな。
let formatter = DateFormatter();
formatter.locale = Locale(identifier: "en_US_POSIX"); // うまく説明できないのですが、これを指定することで、Exifの作成日時から変換できるようになります。
formatter.dateFormat = "yyyy:MM:dd HH:mm:ss"; // Exifに記載される作成日時のフォーマットを指定します。時間は24時間表記のため、"HH"を指定する必要があります。
let date = formatter.date(string: dateTimeOriginal)!;
まとめ
-
CIImage
で画像を読み出す - Exif情報は
CIImage#properties
の"{Exif}"
というキーに入っている - 作成日時はExif情報から
"DateTimeOriginal"
キーで得られる - 作成日時のフォーマットは
yyyy:MM:dd HH:mm:ss
以上です。よろしくお願いいたします。