17
11

More than 5 years have passed since last update.

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

Posted at

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 の方向を強制的に変換する

17
11
0

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
11