Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 3. 이미지 처리 - 이미지 회전 메타 정보 제거 방법 (UIGraphics, CurrentImageContext) 본문

iOS 응용 (swift)

[iOS - swift] 3. 이미지 처리 - 이미지 회전 메타 정보 제거 방법 (UIGraphics, CurrentImageContext)

jake-kim 2023. 11. 9. 01:51

1. 이미지 처리 - heic, heif 개념

2. 이미지 처리 - 회전 각도 메타 정보, 이미지 메타 다이터, imageOrientation (exif)

3. 이미지 처리 - 이미지 회전 메타 정보 제거 방법 (UIGraphics, CurrentImageContext)

안전한 이미지 처리 방법 (저번시간에 알아본 내용)

* 아래 내용에 대한 구체적인 내용은 이전 포스팅 글 참고

  • EXIF 정보나 imageOrientation 정보가 다르고, 이미지를 이미지 서버에 업로드할 때 애초에 imageOrientation 정보를 제거하면 서로 혼돈이 없는 상태로 관리가 가능
  • 아이폰 앨범에서 이미지 회전 메타 정보가 이미 적용된 결과를 보여주기 때문에, swift에서 사용할 때 메타 정보를 제거하고난 후 이미지 서버에 업로드하면 관리가 용이

이미지 회전 메타 정보

90도 반시계 방향으로 회전된 이미지

  • 지난 시간에 알아본 메타 정보를 출력해보면, right로 출력
if let image = UIImage(named: "IMG_2467.JPG") {
    printAngle(image)
    
    /*
     right
     */
}

func printAngle(_ image: UIImage) {
    switch image.imageOrientation {
    case .up:
        print("up")
    case .upMirrored:
        print("upMirrored")
    case .right:
        print("right")
    case .rightMirrored:
        print("rightMirrored")
    case .down:
        print("down")
    case .downMirrored:
        print("downMirrored")
    case .left:
        print("left")
    case .leftMirrored:
        print("leftMirrored")
    default:
        print("unknown")
    }
}
  • orientation을 제거하는 함수 정의
    • 방향이 .up이면 회전이 안되어있다는 것이므로 pass
func removedOrientationImage(_ image: UIImage) -> UIImage {
    guard image.imageOrientation != .up else { return image }

}
  • 그래픽 컨텍스트 생성
UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale)
  • 기존 이미지(image)를 새로 생성한 그래픽 컨텍스트로 그림
    • 이 단계에서 이미지를 다시 그리는 것이므로 메타 정보가 삭제
image.draw(in: CGRect(origin: .zero, size: image.size))
  • 그래픽 컨텍스트에서 이미지를 가져와서 normalizedImage 변수에 저장
let normalizedImage = UIGraphicsGetImageFromCurrentImageContext()
  • 컨텍스트 제거
UIGraphicsEndImageContext()
  • 완성
func removedOrientationImage(_ image: UIImage) -> UIImage {
    guard image.imageOrientation != .up else { return image }
    
    UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale)
    image.draw(in: CGRect(origin: .zero, size: image.size))
    let normalizedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return normalizedImage ?? image
}

(사용하는 쪽)

if let image = UIImage(named: "IMG_2467.JPG") {
    printAngle(image)
    imageView1.image = image
    
    let removedOrientationImage = removedOrientationImage(image)
    printAngle(removedOrientationImage)
    imageView1.image = removedOrientationImage
    
    /*
     right
     up
     */
}

 

* 전체 코드: https://github.com/JK0369/ExOrientation

 

Comments