LoginSignup
17
17

More than 5 years have passed since last update.

Photos frameworkでExifつき写真を保存する

Posted at

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に移行していくのはいんだけど、前より手間が増えてるのはなんともつらいですね

参考

おまけ

この記事は↓のアプリの手直しをしてるときに困ったことをまとめたものです。

17
17
3

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