일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- SWIFT
- PushNotification
- 화면전환
- NotificationCenter
- struct
- IOS
- self
- escaping
- 고차함수
- ScrollView
- Switch
- mvvm
- segue
- Observer
- Refresh
- uikit
- singleton
- apns
- Git
- Animation
- array
- 글또
- viewlifecycle
- SWIFTUI
- error
- http
- calendar
- CoreImage
- class
- list
- Today
- Total
seong_hye, the developer
Swift) UIImage vs CGImage에 대해 알아보기 본문
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: 이미지 처리 및 픽셀 단위 연산, 성능이 중요한 작업을 할 때
'IOS' 카테고리의 다른 글
Swift) 번역 기능 (0) | 2025.08.21 |
---|---|
Swift) CoreImage에 대해서 알아보자 (0) | 2025.08.12 |
Swift) .DS_Store에 대해 알아보기 (0) | 2025.01.08 |
iOS) 클래스(Class) vs 구조체(Struct) 제대로 알아보기 (0) | 2024.03.27 |
iOS) SwiftLint는 무엇일까? (0) | 2024.03.17 |