ImageIOのCGImageDestinationAddImageやCGImageDestinationSetPropertiesを使ってExifつきのデータをつくって、PHAssetChangeRequest.creationRequestForAssetFromImageAtFileURLで書き込むとうまくいく。(Xcode7.3.1)
以下、経緯とか詳細。
ALAssetsLibraryのwriteImageToSavedPhotosAlbumを使ってExifつきの写真を保存していたんだけれど、ALAssetsLibraryがiOS9でdeprecatedの警告がでる
'ALAssetsLibrary' was deprecated in iOS 9.0: Use PHPhotoLibrary from the Photos framework instead
'writeImageToSavedPhotosAlbum(_:metadata:completionBlock:)' was deprecated in iOS 9.0: Use creationRequestForAssetFromImage: on PHAssetChangeRequest from the Photos framework to create a new asset instead
この警告によると、Photos FrameworkのPHAssetChangeRequestを使えとのこと。さっそくそっちのAPIを見てみると、なんとmetadataを渡すような部分ない。locationやcreationDateくらいはあるんだけど、それだけあっても…。
ということで、もう少ししらべてみると、ImageIOのCGImageDestinationAddImageやCGImageDestinationSetProperties、でperopetyを引数にとってExif埋め込んだデータ(NSData)がつくれそう。そこからUIImageつくって、creationRequestForAssetFromImageかなと思ったら、それではダメ。
UIImage作るんじゃなくて、いったんファイルに書き込んでおいて、PHAssetChangeRequest.creationRequestForAssetFromImageAtFileURLを使うことでExifつきの写真が保存できた。
CGImageのcgと、ExifデータはいってるDictionaryのmetaがあるとして、ALAssetLibraryでやっていたのを、こういう風に書き換えた。
ALAssetsLibrary().writeImageToSavedPhotosAlbum(cg, metadata: meta, completionBlock: {
(assetURL, err) in print(assetURL, err)
})
↓
let tmpName = NSProcessInfo.processInfo().globallyUniqueString
let tmpUrl = NSURL.fileURLWithPath(NSTemporaryDirectory() + tmpName + ".jpg")
if let dest = CGImageDestinationCreateWithURL(tmpUrl, kUTTypeJPEG, 1, nil) {
CGImageDestinationAddImage(dest, cg, meta)
CGImageDestinationFinalize(dest)
PHPhotoLibrary.sharedPhotoLibrary()
.performChanges({ PHAssetChangeRequest.creationRequestForAssetFromImageAtFileURL(tmpUrl) },
completionHandler: { (ok, err) in
print(ok, err)
let _ = try? NSFileManager.defaultManager().removeItemAtURL(tmpUrl)
})
}
新しいAPIに移行していくのはいんだけど、前より手間が増えてるのはなんともつらいですね
参考
- ALAssetsLibrary Class Reference https://developer.apple.com/library/ios/documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/
- PHAssetChangeRequest Class Reference https://developer.apple.com/library/ios/documentation/Photos/Reference/PHAssetChangeRequest_Class/
- CGImageDestination Reference https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGImageDestination/
- [PhotoKit] 이미지 저장하기. http://baccusf.tistory.com/57
おまけ
この記事は↓のアプリの手直しをしてるときに困ったことをまとめたものです。