※ ここではSwiftをMac上でCLIプログラムとして書いています。iOS向けは一部読み替えが必要かもしれません。
※ Swift4です。
※ 一部うまく行ってなくて、困っています。
やること
- 画像を読み込む
- Exifデータを書き換える
- 保存する
手順
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
ではない値を指定するのではないかとにらんでいます。
-
以上です。何かご存知の方いらっしゃいましたら教えてください。