이미지 파일 포맷 in iOS

장수빈·2025년 7월 3일

CS

목록 보기
14/14

포맷 및 특징

포맷압축 방식투명도 지원용도 및 특징
PNG무손실✅ 지원아이콘, UI 요소에 적합 (투명 배경 지원)
JPEG손실❌ 미지원사진처럼 색상이 풍부한 이미지에 적합
HEIC손실/무손실✅ 지원최신 포맷으로 압축률 높음, 애플 기본 포맷
WebP손실/무손실✅ 지원구글 개발, 웹 최적화 이미지 포맷

PNG vs JPEG

특징PNGJPEG
압축 방식무손실 압축손실 압축
투명도(Alpha) 지원✅ 가능❌ 불가능
이미지 품질높은 품질 (무손실)압축률에 따라 품질 저하 발생
파일 크기크기가 비교적 큼압축률이 높아 크기가 작음
적합한 이미지아이콘, 로고 등사진 및 풍경 이미지

앱 UI 요소(버튼, 아이콘 etc)에 주로 png 사용 이유

  • 무손실 압축으로 선명한 이미지 표현 가능
  • 투명도를 지원해 배경과 어울리는 이미지 제작 가능
  • Asset Catalog에 저장 시 자동 최적화 제공(iOS)

색상이 풍부한 이미지에 jpeg이 적합한 이유

  • jpeg은 손실 압축을 사용하여 색상이 많고 복잡한 이미지의 용량을 크게 줄임
  • 사진의 경우 미세한 손실이 눈에 잘 띄지 않기 때문에 jpeg의 높은 압축률이 용량 대비 품질에 유리

HEIC(High Efficiency Image Container)

장점

  • 높은 압축률: jpeg대비 최대 50%이상 파일 크기 감소
  • 투명도 및 애니메이션 지원
  • Live Photo및 Burst Mode 등 여러 이미지 저장 가능
  • 무손실/손실 압축 모두 지원

iOS에서 사용처

  • 기본 카메라 앱의 사진 촬영 시 저장 포맷(iOS 11 이상)
  • Live Photo, Burst Mode 이미지 저장

WebP

특징

  • 구글이 개발한 웹 최적화 포맷
  • 무손실 및 손실 압축 모두 지원, 투명도 지원
  • png/jpeg 대비 파일 크기 평균 25~35% 감소

iOS에서 사용법

  • iOS 14부터 WebP기본 지원(UIImage)
  • iOS 14 미만에서는 SDWebImage, Kingfisher와 같은 라이브러리 사용

무손실 압축 vs 손실 압축

항목무손실 압축손실 압축
품질 손상원본 이미지 품질 유지압축률에 따라 원본 품질 일부 손상
파일 크기상대적으로 큼상대적으로 작음
대표 포맷PNG, TIFF, WebP(무손실)JPEG, HEIC, WebP(손실)
용도UI 요소, 로고, 아이콘 등사진, 배경 이미지 등

iOS Asset Catalog 이미지 최적화

Asset Catalog에 이미지를 저장하면 Xcode가 자동으로 최적화 및 압축을 수행

  • png는 자동으로 최적화(무손실 압축)
  • jpeg은 최적 압축 품질로 변환 및 관리
  • 앱 배퍼 시 디바이스 해상도에 따라 필요한 해상도의 이미지만 제공(App Thinning)

@1x, @2x, @3x 이미지와 디바이스 픽셀 밀도 관계

이미지 리소스디바이스 픽셀 밀도디바이스 예시
@1x1포인트 당 1픽셀 (1x 밀도)초기 아이폰(iPhone 3G 등)
@2x1포인트 당 4픽셀 (2x 밀도)대부분의 아이폰 (예: iPhone 8, SE, iPhone 11)
@3x1포인트 당 9픽셀 (3x 밀도)아이폰 고해상도 디바이스 (예: iPhone 12 Pro, iPhone 15 등)

iOS 이미지 메모리 사용량

이미지 파일 크기로 결정 x -> 해상도로 결정

ex)
1920x1080 해상도의 이미지가 SRGB 포맷으로 저장되어 있다면 픽셀당 4바이트(R, G, B, A 각 1바이트)가 필요하므로 총 8,294,400바이트 (약 8MB)의 메모리를 사용

이미지 다운샘플링으로 메모리 절약

func downsample(imageAt url: URL, to pointSize: CGSize, scale: CGFloat) -> UIImage? {
    let maxDimension = max(pointSize.width, pointSize.height) * scale
    let options = [kCGImageSourceShouldCache: false] as CFDictionary
    guard let source = CGImageSourceCreateWithURL(url as CFURL, options) else { return nil }
    
    let downsampleOptions = [
        kCGImageSourceCreateThumbnailFromImageAlways: true,
        kCGImageSourceShouldCacheImmediately: true,
        kCGImageSourceThumbnailMaxPixelSize: maxDimension
    ] as CFDictionary
    
    guard let cgImage = CGImageSourceCreateThumbnailAtIndex(source, 0, downsampleOptions) else {
        return nil
    }
    
    return UIImage(cgImage: cgImage)
}
profile
iOS 공부 이모저모 낙서장

0개의 댓글