관리 메뉴

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

[iOS - swift] CGImage와 UIImage 개념 이해하기 (고수준 레벨과 저수준 레벨) 본문

iOS 응용 (swift)

[iOS - swift] CGImage와 UIImage 개념 이해하기 (고수준 레벨과 저수준 레벨)

jake-kim 2024. 5. 24. 01:09

CGImage와 UIImage 개념

  • UIImage와 CGImage 모두 이미지에 관한 데이터를 갖고 있는 인터페이스
    • UIImage 데이터가 있으면 CGImage 인스턴스로 변환도 가능
private let image = UIImage(named: "tree")!
let cgImage = image.cgImage
  • UIImage는 cgImage를 wrapping한 형태이며, UI를 그릴때 더욱 고수준 레벨로 인터페이스를 제공하여 UI 작업에 집중할 수 있게 해놓은 것
  • cgImage는 UI를 그리는 인터페이스 외에도 bits와 같은 저수준 레벨의 세부 데이터 접근을 위해서 있는 것

가장 대표적인 예) size 값

  • UIImage의 size 프로퍼티를 사용하면 디바이스의 scale 값을 고려하지 않은 값을 얻어옴
    • x2 스케일을 사용하는 iPhone SE, x3 스케일을 사용하는 iPhone 15 Pro 에서 모두 (800, 800)이 출력됨
private let image = UIImage(named: "tree")!
print(image.size) // (800, 800)
print(image.scale) // 3
  • 하지만 cgImage를 사용하면 scale을 고려한 값으로 출력됨
// iPhone SE
print(image.cgImage!.height, image.cgImage!.width) // (1600, 1600)

// iPhone 15 Pro
print(image.cgImage!.height, image.cgImage!.width) // (2400, 2400)
  • 이렇게 된 이유?
    • UIImage는 고수준 레벨로, UI를 그리는데에 집중해놓은 것 (보통 autolayout으로 뷰를 그릴때도 scale을 고려하지 않고 120의 크기로 고정해놓으면 디바이스에 따라 알아서 배치가 되는 원리와 동일)
    • cgImage는 저수준 레벨로, 이미지의 bits와 같은 데이터 접근이 가능한 것
  • 실제로 UIImage의 개발 문서를 보면 UIImage는 이미지 데이터의 저수준 레벨에 있는 데이터를 직접적으로 접근하는 인터페이스를 숨기고 CGImage나 CIIMage로 접근해야지 사용이 가능

https://developer.apple.com/documentation/uikit/uiimage

 

* 참고

- https://developer.apple.com/documentation/uikit/uiimage

Comments