[TECH]왜 HEIC를 JPG로 변환하면 용량이 커질까?

임효진·2025년 10월 13일
0

TECH

목록 보기
1/1

이슈

회사에서 이미지 업로드 시에 10MB제한을 걸었는데 실제 용량이 최대 5MB에 불과함에도 방어코드에 걸리는 이슈가 있었다.

HEIC → JPG 변환 시 용량이 커지는 이유

아이폰으로 찍은 사진을 보면 확장자가 .heic인 경우가 많다.
그런데 이 파일을 .jpg로 변환하면 이상하게 용량이 커진다.
“둘 다 사진인데 왜 커질까?”
이건 단순한 형식 차이가 아니라 압축 기술 세대의 차이 때문이다.


1. HEIC는 HEVC 기반, JPG는 90년대 기술

HEIC는 High Efficiency Image Container의 약자다.
내부적으로 HEVC(H.265) 영상 압축 기술을 사용한다.
반면 JPG(JPEG)는 1990년대 초반에 만들어진 DCT(Discrete Cosine Transform) 기반 압축 방식을 쓴다.

즉,

  • HEIC는 H.265 동영상 기술을 정지 이미지에 적용한 최신 포맷,
  • JPG는 1990년대의 고전적인 포맷이다.
항목HEICJPG
등장 시기2017년 (iOS 11)1992년
압축 방식HEVC(H.265)DCT(JPEG)
압축 효율높음 (약 50% 작음)낮음
색심도최대 10bit8bit
평균 용량작음

2. 변환은 단순한 ‘형식 변경’이 아니다

많은 사람이 HEIC → JPG 변환을
그냥 확장자만 바꾸는 일로 생각하지만 실제로는 그렇지 않다.

이 과정에서 HEIC의 고효율 압축 데이터를 풀었다가,
효율이 낮은 JPG 알고리즘으로 다시 압축한다.
그래서 같은 화질을 유지하려면 용량이 커질 수밖에 없다.


3. HEIC와 JPG의 압축 방식 차이

HEIC (HEVC 기반)

  • 인접한 픽셀의 색과 밝기를 예측하고
    실제 값과의 차이(오차값)만 저장한다.
  • 동영상 압축처럼 공간적 상관관계를 적극 활용한다.

JPG (DCT 기반)

  • 이미지를 8×8 블록으로 나누어 각각을 독립적으로 압축한다.
  • 블록 간 관계를 고려하지 않아 압축 효율이 떨어진다.

예를 들어 같은 12MP 사진이라면:

포맷평균 용량화질 수준
HEIC약 2MB기준
JPG (quality 95)약 6~8MB비슷한 화질

4. 색심도(비트 깊이) 차이

HEIC는 최대 10bit 색심도를 지원한다.
한 픽셀의 색을 더 정밀하게 표현할 수 있다.

JPG는 8bit까지만 가능하다.
HEIC를 JPG로 바꿀 때는 고비트 데이터를 낮은 비트로 줄이는 과정이 필요하다.
이때 디더링(dithering) 을 적용해 색 계단 현상을 줄이지만,
픽셀 데이터가 복잡해지면서 압축 효율이 떨어지고 용량이 커진다.


5. 변환 시 ‘품질(quality)’ 인자 영향

JPG로 저장할 때는 품질(quality) 값을 지정할 수 있다.
값이 높을수록 화질은 좋지만 용량도 커진다.

원본변환 품질변환 후 용량
HEIC 2MBJPG quality=95약 6~8MB
HEIC 2MBJPG quality=80약 3~4MB

결국 같은 화질을 유지하면 용량이 커지고,
용량을 줄이려면 화질을 낮춰야 한다.


6. 메타데이터 구조 차이

HEIC는 하나의 컨테이너 안에 여러 이미지와 EXIF 데이터를 효율적으로 압축한다.
“라이브 포토”처럼 여러 장이 들어가도 하나의 파일로 관리된다.

JPG는 헤더 세그먼트마다 중복 메타데이터를 포함할 수 있다.
이 구조 차이 때문에 JPG가 더 많은 공간을 차지한다.


7. Flutter에서의 변환 과정

Flutter에서 HEIC → JPG 변환을 수행하면
기본적으로 “디코드 후 재인코드”가 일어난다.

자주 쓰는 라이브러리는 다음과 같다.

예시 코드:

final result = await FlutterImageCompress.compressWithFile(
  inputPath,
  format: CompressFormat.jpeg,
  quality: 80, // 낮을수록 용량 줄어듦
  outputPath: outputPath,
);

정리

HEIC는 HEVC(H.265) 기반의 고효율 압축을 쓴다.

JPG는 오래된 DCT 기반 압축이라 효율이 낮다.

변환은 단순 복사가 아니라 디코드 + 재인코드 과정이다.

같은 화질을 유지하면 JPG 용량이 커진다.

Flutter에서는 flutter_image_compress로 품질 제어가 가능하다.

한 줄 요약
HEIC → JPG 변환은 ‘효율적인 압축을 풀고, 덜 효율적인 방식으로 다시 압축하는 과정’이다.
따라서 용량이 커지는 건 자연스러운 결과다.

참고 자료

Adobe: HEIC vs JPEG

Wikipedia: Wikipedia: (HEVC)

Wikipedia: High Efficiency Image File Format (HEIF)

Petapixel: What is an HEIC File?

Cloudinary: JPEG vs HEIC

Wikipedia: JPEG

pub.dev: flutter_image_compress

pub.dev: heic_to_jpg

StackOverflow: Picking images as jpeg/png instead of heic on iOS

0개의 댓글