회사에서 이미지 업로드 시에 10MB제한을 걸었는데 실제 용량이 최대 5MB에 불과함에도 방어코드에 걸리는 이슈가 있었다.
아이폰으로 찍은 사진을 보면 확장자가 .heic인 경우가 많다.
그런데 이 파일을 .jpg로 변환하면 이상하게 용량이 커진다.
“둘 다 사진인데 왜 커질까?”
이건 단순한 형식 차이가 아니라 압축 기술 세대의 차이 때문이다.
HEIC는 High Efficiency Image Container의 약자다.
내부적으로 HEVC(H.265) 영상 압축 기술을 사용한다.
반면 JPG(JPEG)는 1990년대 초반에 만들어진 DCT(Discrete Cosine Transform) 기반 압축 방식을 쓴다.
즉,
| 항목 | HEIC | JPG |
|---|---|---|
| 등장 시기 | 2017년 (iOS 11) | 1992년 |
| 압축 방식 | HEVC(H.265) | DCT(JPEG) |
| 압축 효율 | 높음 (약 50% 작음) | 낮음 |
| 색심도 | 최대 10bit | 8bit |
| 평균 용량 | 작음 | 큼 |
많은 사람이 HEIC → JPG 변환을
그냥 확장자만 바꾸는 일로 생각하지만 실제로는 그렇지 않다.
이 과정에서 HEIC의 고효율 압축 데이터를 풀었다가,
효율이 낮은 JPG 알고리즘으로 다시 압축한다.
그래서 같은 화질을 유지하려면 용량이 커질 수밖에 없다.
HEIC (HEVC 기반)
JPG (DCT 기반)
예를 들어 같은 12MP 사진이라면:
| 포맷 | 평균 용량 | 화질 수준 |
|---|---|---|
| HEIC | 약 2MB | 기준 |
| JPG (quality 95) | 약 6~8MB | 비슷한 화질 |
HEIC는 최대 10bit 색심도를 지원한다.
한 픽셀의 색을 더 정밀하게 표현할 수 있다.
JPG는 8bit까지만 가능하다.
HEIC를 JPG로 바꿀 때는 고비트 데이터를 낮은 비트로 줄이는 과정이 필요하다.
이때 디더링(dithering) 을 적용해 색 계단 현상을 줄이지만,
픽셀 데이터가 복잡해지면서 압축 효율이 떨어지고 용량이 커진다.
JPG로 저장할 때는 품질(quality) 값을 지정할 수 있다.
값이 높을수록 화질은 좋지만 용량도 커진다.
| 원본 | 변환 품질 | 변환 후 용량 |
|---|---|---|
| HEIC 2MB | JPG quality=95 | 약 6~8MB |
| HEIC 2MB | JPG quality=80 | 약 3~4MB |
결국 같은 화질을 유지하면 용량이 커지고,
용량을 줄이려면 화질을 낮춰야 한다.
HEIC는 하나의 컨테이너 안에 여러 이미지와 EXIF 데이터를 효율적으로 압축한다.
“라이브 포토”처럼 여러 장이 들어가도 하나의 파일로 관리된다.
JPG는 헤더 세그먼트마다 중복 메타데이터를 포함할 수 있다.
이 구조 차이 때문에 JPG가 더 많은 공간을 차지한다.
Flutter에서 HEIC → JPG 변환을 수행하면
기본적으로 “디코드 후 재인코드”가 일어난다.
자주 쓰는 라이브러리는 다음과 같다.
heic_to_jpg: 네이티브에서 HEIC를 디코딩 후 JPG로 저장 flutter_image_compress: quality 값으로 용량 제어 가능예시 코드:
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