これは
画像のExifデータ(metadata)を編集して、
それを保ったままフォトライブラリーに保存したいな〜と思っていましたが、案外情報がなかったのでまとめてみました。
(現在Deprecatedになっている情報が多かった)
実装
Exifの読み込み
// URLからCGImageSourceを作成 URLはPHPickerViewControllerから取得を想定
let cgImageSource = CGImageSourceCreateWithURL(url as CFURL, nil)
// Exif
let metadata = CGImageSourceCopyPropertiesAtIndex(cgImageSource, 0, nil) as? [String: Any]
- 位置情報の場合
var locationDictionary = metadata[kCGImagePropertyGPSDictionary as String] as? [String: Any]
// Latitude & Longitude
locationDictionary[kCGImagePropertyGPSLatitude as String]
locationDictionary[kCGImagePropertyGPSLongitude as String]
このほかのそれぞれのキー値はこちらを参照
Exifへの書き込み
これは先ほど取得した値を使っていきます。
// Latitude & Longitude
locationDictionary[kCGImagePropertyGPSLatitude as String] = "0.000"
locationDictionary[kCGImagePropertyGPSLongitude as String] = "0.000"
// 上書き
metadata[kCGImagePropertyGPSDictionary as String] = locationDictionary
フォトライブラリーに保存
// 書き込み用のCGImageを作成
guard let cgImage = CGImageSourceCreateImageAtIndex(cgImageSource, 0, nil) else { return }
// 任意の名前をセット
let tmpName = UUID().uuidString
// URLを作成
let tmpUrl = NSURL.fileURL(withPath: NSTemporaryDirectory() + tmpName + ".jpeg")
if let _ = CGImageDestinationCreateWithURL(tmpUrl as CFURL, UTType.jpeg.identifier as CFString, 1, nil) {
// 先ほどのmetadaをCGImageに反映する
CGImageDestinationAddImage(destination, cgImage, metadata as CFDictionary)
// 指定したURLに書き込み
CGImageDestinationFinalize(destination)
PHPhotoLibrary.shared().performChanges({
// フォトライブラリーに書き込み
PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: tmpUrl)
}, completionHandler: { success, error in
print("performChanges success: \(success), error: \(error?.localizedDescription)")
// tmpFile削除する
})
}
ポイントはCGImageDestinationFinalize
を使って適当な場所に保存してしまうこと
そこからPhotoKit
のPHPhotoLibrary
を使って、フォトライブラリーに保存してあげてください
終わり
その他
フォトライブラリーに保存する際にUIImage
に変更してしまうと、Exifが欠損してしまうので注意
参考
ドキュメント: https://developer.apple.com/documentation/imageio
stackoverflow: https://stackoverflow.com/questions/51987255/save-images-to-photos-gallery-in-ios-with-exif-data-using-swift
サンプルプロジェクト: https://github.com/Take111/PhotoPickerSample