iOS
UIImage
Swift
CGImage
UIImageOrientation

CGImageは画像の向きを保持していない


CGImageは画像の向きを保持していない

画像編集アプリ(iOSCameraSample – GitHub) を作成している際にハマったため,備忘録として記事にします。

記事が古くならないよう,参照を添えてAgeておきます。知らないと必ずハマります。ハマりました。


発生した問題

コントラストを変更しようと編集したUIImageUIImageViewに反映させた際に,何故か画像が横に回転してしまった。


原因

CGImageが向きのパラメータを保持していないことが原因であった。

画像のコントラストを変更するために必要な,

UIImage -> CGImage -> CIImage -> CGImage -> UIImage

へとキャストしていく過程で,

UIImageからCGImageへの変換時に方向パラメータを喪失した。

let uiImage = UIImage()

let cgImage = uiImage.cgImage

CGImageからUIImageへの変換時に

UIImage.imageOrientationがnilとなり,表示先のUIImageViewが方向を読み取れなくなったことが原因。

var uiImage = UIImage()

let cgImage = uiImage.cgImage
uiImage = UIImage(cgImage: cgImage, scale: 0, orientation: nil)


対策

UIImageの向きのパラメータを保持し,UIImageにキャストする際に向きのパラメータ(UIImageOrientation)を注入する。

func translate(from image: UIImage) -> UIImage? {

guard let cgImage = image.cgImage else { return nil }
let ciImage = CIImage(cgImage: cgImage)
let ciContext = CIContext(options: nil)

/* CIImageを使用した画像編集処理 */

guard let cgImage: CGImage = ciContext.createCGImage(image, from: image.extent) else { return nil }
let result = UIImage(cgImage: cgImage, scale: 0, orientation: image.imageOrientation)
return result
}


参考

画像に何か加工を行った際に向きが勝手に変わってしまう

iPhoneカメラで撮影した画像のUIImageからCGImageを取り出すと90度傾く問題の解決法

Swift で UIImage の方向を強制的に変換する