seong_hye, the developer

Swift) UIImage vs CGImage에 대해 알아보기 본문

IOS

Swift) UIImage vs CGImage에 대해 알아보기

seong_hye 2025. 9. 4.

 

iOS 개발에서 이미지를 다룰 때 자주 접하게 된 두가지 주요 클래스인

UIImage, CGImage에 대해 알아보려함


📘 UIImage

UIKit 프레임워크에 속하는 고수준 이미지 클래스

iOS 개발자가 가장 일반적으로 사용하는 이미지 표현 방식

let image = UIImage(named: "example.png")
imageView.image = image

 

🔹 주요 특징

UIKit의 일부로 UI 컴포넌트와의 통합이 쉬움

이미지 방향(orientation) 정보를 포함하고 있어 자동 회전을 지원함

캐싱 메커니즘을 내장하고 있어 성능 최적화에 도움이 됨

다양한 이미지 포맷(PNG, JPEG, HEIF..)을 지원함

스케일 팩터(@2x, @3x)정보를 포함함


📘 CGImage

Core Graphics 프레임 워크의 일부로 저수준 비트맵 이미지를 나타냄

픽셀 데이터에 직접 접근할 수 있는 더 기본적인 이미지 표현

if let cgImage = image.cgImage {
	let width = cgImage.width
    let height = cgImage.hgieht
    // 이미지 픽셀 데이터 처리 가능
}

 

🔹 주요 특징

Core Graphics의 일부로 그래픽 컨텍스트와 직접 연동됨

픽셀 데이터에 대한 저수준 접근이 가능

이미지 방향 정보를 포함하지 않음

메모리 효율적이고 성능이 뛰어남

픽셀 포멧과 색상 공간에 대한 세밀한 제어가 가능함


🔍 공통점

➡️ 이미지 표현

둘 다 비트맵 이미지 데이터를 표현하는 데 사용됨

 

➡️ 메모리 관리

둘 다 ARC(Automatic Reference Counting)에 의해 관리됨

 

➡️ 불변성

생성 후 이미지 데이터 자체는 변경할 수 없음

 

➡️ 상호 변환 가능

UIImage와 CGImage는 서로 변환이 가능함

// UIImage > CGImage
let cgImage = uiImage.cgImage

// CGImage > UIImage
let uiImage = UImage(cgImage: cgImage)

🔍 차이점

➡️ 소속 프레임워크

UIImage : UIKit (고수준 UI 프레임워크)

CGImage : Core Graphics (저수준 그래픽 프레임워크)

 

➡️ 클래스 형태

UImage: Objective - C 기반 클래스 (NSObject 상속)

CGImage: Core Foundation 기반 객체 (C 스타일 포인터 기반)

 

➡️ 사용 환경

UIImage: 주로 UIKit 기반의 iOS 앱에서 UI를 위한 이미지 표현

CGImage: 그래픽 연산, 이미지 처리 및 드로잉 작업 시 사용

 

➡️ 확장자 지원

UIImage: PNG, JPEG 등 다양한 이미지 포맷 지원

CGImage: 이미지 포멧에 독립적인 비트맵 표현

 

➡️ 메모리 관리

UIImage: ARC 지원

CGImage: 수동 관리가 필요 (생성시 CGImageRelease 필요)

 

➡️ 백그라운드 스레드 처리

UIImage: UI 관련 작업이므로 메인스레드에서 권장 (렌더링 등)

CGImage: 백그라운드 스레드에서도 자유롭게 사용 가능

 

➡️ 기능 

UIImage: 이미지 파일 로드, 렌더링, 이미지 표현, 간단한 조작 (회전, 크기 조정 등)

CGImage: 비트맵 이미지 데이터 직접 접근, 정교한 픽셀 단위 처리

 

➡️ 기능 수준

UIImage: 고수준 기능

let resizedImage = originalImage.resized(to: newSize)
let rotatedImage = originalImage.rotated(by: angle)

 

CGImage: 저수준 접근

let width = cgImage.width
let height = cgImage.height
let bitsPerPixel = cgImage.bitsPerPixel
let colorSpace = cgImage.colorSpace

 

➡️ 메타데이터처리

UIImage: 방향 정보 포함

let orientation = uiImage.imageOrientation
let scale = uiImage.scale

 

CGImage: 순수 픽셀 데이터만 ( 방향 정보 X, 스케일 정보 없음)

 

➡️ 성능 특성

UIImage: 편의성 중심

let image = UiImage(named: "photo") // 캐싱, 자동 스케일링

 

CGImage: 성능 중심

let cgImage = CGImage(...) // 직접적인 픽셀 데이터 접근

🔍 사용하는 경우

➡️ UIImage를 사용하는 경우

UI 컴포넌트에 이미지 표시

이미지 방향 자동 처리가 필요한 경우

간단한 이미지 조작 및 변환

애플리케이션 번들에서 이미지 로드

// UI 표시용
imageView.image = UIImage(named: "photo")

// 간단한 변환
let scaleImage = originalImage.scaleAspectFit(in: targetSize)

 

➡️ CGImage를 사용하는 경우

이미지 픽셀 데이터에 직접 접근

COre Image나 Metal과의 연동

고성능 이미지 처리

커스텀 그래픽 컨텍스트에서 그리는 경우

// 픽셀 데이터 접근
let dataProvider = cgImage.dataProvider
let pixelData = dataProvider?.data

// Core Graphics 컨텍스트에서 그리기
context.draw(cgImage, in: rect)

// Core Image 필터 적용
let ciImage = CIImage(cgImage: cgImage)

🔍 메모리 및 성능 고려사항

➡️UIImage의 경우

내부적으로 CGImage를 포함하고 있어 약간의 오버헤드 존재

편의 기능들로 인한 추가 메모리 사용

캐싱으로 인한 메모리 효율성과 성능 향상

 

➡️ CGImage의 경우

순수 픽셀 데이터만 포함하여 메모리 효율적

직접적인 하드웨어 가속 가능

저수준 최적화에 유리


📌 정리

UIImage: 간단한 UI에 이미지를 표시하거나 빠르게 이미지를 다루려 할 때

CGImage: 이미지 처리 및 픽셀 단위 연산, 성능이 중요한 작업을 할 때

Comments