11
11

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. 画像を読み込む
  2. Exifデータを書き換える
  3. 保存する

手順

1. 画像を読み込む

CIImageを使います。
こっちに少しだけ多めに書いています。

let image = CIImage(contentsOf: url);

2. Exifデータを書き換える

ExifデータはDictionary型なので、正確には、コピーを変更することになります。

var properties = image.properties;
var exif = properties["{Exif}"] as! [String: Any];
exif["DateTimeOriginal"] = "2000:01:01 12:30:00";
// 書き換えたexifをpropertiesに持たせる。
properties["{Exif}"] = exif;

3. 保存する

CIImageを保存するには、CGImageを経由する必要があります(他に方法ないのか?)
保存すると、なぜだかよくわからないのですが、画像のデータサイズが半分くらいになります(なので、Exifの書き換え"だけ"はできていません)

// CGImageを保存するための枠を用意する
if let dst = CGImageDestinationCreateWithURL(URL(fileURLWithPath: url, kUTTypeJPEG, 1, nil) {
  // CIImageをCGImageに変換するために必要
  let ctx = CIContext();
  // 画像とメタデータを枠にセットする
  CGImageDestinationAddImage(dst, ctx.createCGImage(image, from: image.extent)!, properties as CFDictionary);
  // 保存する
  CGImageDestinationFinalize(dst);
}

まとめ

  • CGImageを保存するときに、Exifデータなどのメタデータを渡すことができ、書き換えることもできる
  • なぜか知らないけど、データサイズが半分くらいになる(見た目からはわからなかった)
    • kUTTypeJPEGではない値を指定するのではないかとにらんでいます。

以上です。何かご存知の方いらっしゃいましたら教えてください。

11
11
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
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?