iOS/Swift

PNG vs JPEG vs HEIC

하노 Hano 2024. 9. 18. 17:57

안녕하세요, 하노입니다 :D

 

얼마 전 image를 서버에 업로드하는 기능을 구현 중,

원본 이미지 크기가 약 5MB임에도 불구하고 서버에서 image 10MB 용량 제한에 걸려 에러가 나는 상황이 있었습니다!

확인해 보니 image를 처리해 주는 모듈에서 UIImage Type을 Data Type으로 변환 시

pngData()를 사용하고 있더라구요.

 

여기서 엄청난 용량 뻥튀기(?)가 된다는 사실을 알고,

jpegData(compressionQuality:) 를 사용하여 에러를 처리하였는데요,

 

이번 기회로 UIImage Type에서 Data Type으로 변환할 때

image 파일 형식을 비교하면서 어떤 차이점이 있는지 알아보려고 합니다!

 

 

그럼 시작하겠습니다!

 

 


 

1. Method

우선 각 메서드별로 어떻게 동작하는지 알아보겠습니다!

 

 

1. pngData()

PNG 포맷의 이미지 형식을 Data Type으로 변환시켜 주는 메서드입니다.

 

return은 Data Optional Type으로

  • 이미지에 CGImageRef가 없거나,
  • 잘못된 비트맵 형식이 있는 경우

nil로 반환합니다.

 

 

2. jpegData(compressionQuality:)

JPEG 포맷의 이미지 형식을 Data Type으로 변환시켜주는 메서드입니다.

 

compressionQuality (CGFloat Type)으로 0~1 사이의 입력 값으로 이미지를 압축시켜 품질을 설정할 수 있습니다.

(0: 최저 품질, 1: 최고 품질)

 

 

return은 Data Optional Type으로 

  • 이미지에 CGImageRef가 없거나,
  • 잘못된 비트맵 형식이 있는 경우

nil로 반환합니다.

 

 

3. heicData()

(iOS 17.0+)

HEIC 포맷의 이미지 형식을 Data Type으로 변환시켜주는 메서드입니다. 

 

return은 Data Optional Type으로 

  • 이미지를 나타내는 HEIC 데이터를 반환할 수 없는 경우

nil로 반환합니다.

 

 

 

 

그럼 이 메서드를 실제로 써봐야겠죠??

 

간단한 예제를 만들어서 메서드를 실행시켜 보겠습니다!

 

 

 

2. 예제 실행

class ViewController: UIViewController {
    let imagePicker = UIImagePickerController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        imagePicker.sourceType = .camera
        imagePicker.delegate = self
        self.present(imagePicker, animated: true)
    }
}

 

위 코드처럼 화면이 나타나면 바로 imagePicker가 올라오도록 작성했습니다.

 

 

 

그리고 저희 집 전기를 담당하고 있는 라이츄를 카메라로 찍어보겠습니다!

 

 

 

 

그리고 각 메서드를 호출해서 출력해 보면

 

 

 

  • pngData() : 13752066 Bytes = 약 13.11 MB
  • jpegData(compressionQuality: 1.0) : 5463939 Bytes = 약 5.2MB
  • heicData() : 1854811 Bytes = 약 1.76 MB

 

가 나옵니다.

 

 

용량 순으로 보면

 

PNG >>>  JPEG  >  HEIC

 

로 PNG가 압도적으로 용량이 큽니다...!!

 

 

자! 이제 왜 그런지 알아봐야겠죠???

 

 

3. PNG vs JPEG vs HEIC

 

PNG (Portable Network Graphics)

무손실 압축 방식을 사용하는 이미지 포맷

 

 

JPEG (Joint Photographic Experts Group)

손실 압축 방식을 사용하는 포맷

 

 

HEIC (High Efficiency Image Coding)

HEVC(H.265) 동영상 압축 기술을 기반으로 한 이미지 포맷

 

 

 

 

위 설명에서 결과를 도출하면,

용량이 차이 나는 이유는 무손실 압축 방식이냐 손실 압축 방식이냐의 차이였습니다...!!

 

그리고 HEIC가 현저하게 JPEG 압축 방식보다 용량이 적은 이유는 JPEG보다 더 효율적인 손실 압축 방식을 사용하기 때문에

용량을 더 적게 저장한다고 합니다!!

 

 


 

 

오늘은 PNG, JPEG, HEIC에 대해 알아보고 각 용량이 차이나는 이유를 알아보았습니다.

 

내용은 간단하지만 그동안 정확한 정의를 모르고 있어서 공부할 겸 정리해 보았는데요,

 

특히 HEIC는 애플에서 주로 사용하고 있는 포맷이지만,

그 방식에 대해서는 아예 모르고 있었던 저를 이번 기회에 글을 쓰면서 정확하게 알았습니다...!!

 

 

그럼!!