Language/Swift

[Swift] UIImage, CGImage 그리고 CIImage 언제 사용되나

jaewpark 2024. 2. 14. 17:02

우선 각 Image가 무엇을 나타내는지 보려고 합니다. 

UIImage

모든 이미지 형식에 대한 데이터를 나타내며 관리 가능합니다.
immutable 특성으로 항상 이미지 데이터에서 이미지를 만들어야 합니다.

이미지 객체의 불변 특성은 모든 스레드에서 안전하게 만들고 사용할 수 있음을 의미

UIImageView에 있는 이미지를 업데이트하려면 새로운 UIImage를 만들어서 설정해야 한다. 따라서 이미지를 변경할 때에는 CGImage, CIImage 의 데이터를 가져와 변환하고 UIImage를 만들어야 합니다.

 

이미지 객체는 모든 플랫폼 네이티브 이미지 형식을 지원하지만 PNG 또는 JPEG 파일을 사용하는 것이 좋습니다. 두 가지 형식을 모두 읽고 표시하는 데 최적화되어 있으며, 다른 이미지 형식보다 더 나은 성능을 제공합니다. PNG 형식은 무손실이기 때문에 앱 인터페이스에서 사용하는 이미지에 특히 권장됩니다.

 

Core Graphics images 또는 직접 만든 이미지 데이터와 같은 특정 형식의 데이터에서 애니메이션을 만들 수 있습니다. UIGraphicsGetImageFromCurrentImageContext 함수를 통해서 비트맵 기반 그래픽 컨텍스트와 함께 사용하여 이미지를 만듭니다.

CGImage

Core Graphics 프레임워크에 속해있는 비트맵 이미지 혹은 이미지 마스크입니다.
비트맵으로 관리할 수 있으며, 이미지 위에 그리거나 변형할 때 사용할 수 있습니다.

이미지 마스크는 이미지의 일부분을 보이거나 숨기거나 다른 이미지와 결합하는 기능. 참고 공식 문서

 

context 내 작업을 하고 UIGraphicsGetCurrentContext() 로 완료된 이미지를 UIImage로 생성하면 됩니다.

Core Graphics
Quartz technology을 활용하여 고화질 출력으로 경량 2D 렌더링을 수행합니다.
path 기반의 draw, 변형, 색상관리, 그라데이션 등 여러 가지를 처리할 수 있습니다.

공식 문서
Quartz 2D
Core Graphics

CIImage

Core Image 프레임워크에 속해있는 이미지입니다.
내부에서 제공되는 CIFilter에 의해 처리되거나 생성될 이미지의 표현

Core Image
Core Image는 스틸 및 비디오 이미지를 거의 실시간으로 처리하도록 설계된 이미지 처리 및 분석 기술입니다. GPU 또는 CPU 렌더링 경로를 사용하여 작동을 하지만 GPU에서 CIFilter를 사용합니다.

공식 문서
Core Image 아카이브
Core Image

Not Image
Although a CIImage object has image data associated with it, it is not an image
객체에는 연관된 이미지 데이터가 있지만 CIImage는 이미지는 아닙니다.

 

개체에는 CIImage 이미지를 생성하는 데 필요한 모든 정보가 있지만 Core Image는 지시가 있을 때까지 실제로 이미지를 렌더링하지 않습니다.

CGContext를 사용하여 처리하는 것보다 CIContext의 필터를 적용하는 게 시간이 적게 걸리는 걸 체감할 수 있습니다.

 

CIContextCIImage 개체는 변경할 수 없으므로 스레드 간에 각각을 안전하게 공유할 수 있습니다.
그러나 CIFilter 개체의 경우에는 그렇지 않다.

UIImage의 속성

cgImage 데이터를 불러올 때 값이 없을 수도 있습니다.

  • If the UIImage object was initialized using a CIImage object, the value of the property is NULL

ciImage 데이터를 불러올 때 값이 없을 수도 있습니다.

  • If the UIImage object was initialized using a CGImage, the value of the property is nil.

정리글

UIImage는 불변성 특성으로 변경된 이미지를 사용하기 위해서는 새로 만들어야 한다.

CIImage는 CIFilter를 사용하여 생성된 이미지 데이터로 GPU가 사용된다. Filter에는 사각형 감지, 얼굴 감지 등이 있다.

CGImage는 비트맵을 사용하여 수정하거나 context 위에 새롭게 그려서 이미지를 새롭게 만들 수 있다.

 

그리고 GPT의 답변은?

UIImage는 화면에 이미지를 표시하거나 이미지를 로드하고 저장하는 데 사용되며, CGImage는 이미지를 직접 그리거나 이미지를 렌더링하거나 이미지를 조작할 때 사용됩니다. CIImage는 이미지를 필터링하는데 사용되며, GPU 가속을 활용하여 이미지 처리를 수행하므로 대규모 이미지 처리에 적합합니다.

Reference

참고 블로그