11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swiftで画像のExifデータから作成日時の情報を得る

Last updated at Posted at 2018-10-24

※ ここではSwiftをMac上でCLIプログラムとして書いています。iOS向けは一部読み替えが必要かもしれません。
※ Swift4です。

やること

  1. 画像を読み込み、Exifデータを得る。
  2. Exifデータから作成日時を取り出す。
  3. 作成日時を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

以上です。よろしくお願いいたします。

11
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?