背景
弊社製アプリケーションに、ライブラリからの写真選択機能を搭載しようとしたら、四苦八苦したという・・・
TL;DR (ソースコード載せとくね)
PHAssetからUIImageを生成する方法をまとめておきます。
let requestOption = PHContentEditingInputRequestOptions()
requestOption.isNetworkAccessAllowed = true
asset.requestContentEditingInput(with: requestOption) { (contentEditingInput: PHContentEditingInput?, _) -> Void in
let ciImage = CIImage(contentsOf: contentEditingInput!.fullSizeImageURL!)!
let exifDictionary = ciImage.properties
let image = UIImage(ciImage: ciImage.oriented(forExifOrientation: contentEditingInput!.fullSizeImageOrientation))
// anything you can what ever do you want.
}
注意点
クロージャ内部で受け取るcontentEditingInputは
open var fullSizeImageOrientation: Int32 { get } // EXIF value
を持ちます。
UIKitに慣れ親しんだ私はこれをUIImage.OrientationのValueだと勘違いして3日潰しましたが、この値は、
open func oriented(forExifOrientation orientation: Int32) -> CIImage
下記メソッドに投げるためのOrientationなので、めっっっっっっっっっっっっっっちゃ注意しようね!
(なんでコメントでEXIF Valueと書いてあるのか考えるべきだった)