본문 바로가기

파일 형식 백과사전

같은 사진을 WebP, AVIF, JPG로 저장하면 용량이 얼마나 차이 날까 (직접 측정 후기)

웹에 사진을 올릴 때 형식 하나만 바꿔도 용량이 크게 줄어든다는 말을 자주 듣습니다. WebP가 좋다, 이제는 AVIF다, 하는 이야기 속에서 정작 "내 사진은 얼마나 줄어드는가"는 손에 잡히지 않습니다.

그래서 같은 이미지 한 장을 JPG, WebP, AVIF로 똑같이 저장해 파일 크기를 직접 재 봤습니다. 측정 환경은 윈도우 11, 파이썬 3.14.3, 이미지 라이브러리 Pillow 12.2.0입니다. 결과는 흥미로웠고, 동시에 "이 숫자를 그대로 믿으면 안 되는 이유"도 함께 드러났습니다.

 

측정 방법부터

실제 사진과 비슷하게, 색이 부드럽게 번지는 1280x853 그라데이션 이미지를 만들고 약한 노이즈를 섞은 뒤 살짝 흐림을 줬습니다. 이 한 장을 세 형식으로 같은 품질값(quality) 70, 80, 90에서 저장하고 바이트 수를 쟀습니다.

여기서 quality는 압축을 얼마나 세게 할지 정하는 0에서 100 사이 숫자입니다. 숫자가 높을수록 화질을 더 보존하고 용량은 커집니다.

품질(quality)JPGWebPAVIF
70약 48.0 KB약 10.1 KB약 31.7 KB
80약 67.4 KB약 15.2 KB약 50.0 KB
90약 112.1 KB약 38.0 KB약 81.2 KB

이 부드러운 이미지에서는 셋 다 quality 80 기준으로 WebP가 가장 작고, AVIF가 그다음, JPG가 가장 컸습니다. WebP는 같은 품질값에서 JPG의 4분의 1 수준까지 내려갔습니다. 색이 부드러운 사진이라면 JPG보다 WebP나 AVIF가 더 작게 저장되는 경향이 분명했습니다.


그런데 이미지가 바뀌면 순위가 뒤집혔습니다

여기서 멈추면 "AVIF보다 WebP가 무조건 작다"고 오해하기 쉽습니다. 그래서 같은 코드로 노이즈를 강하게 넣은, 거칠고 자글자글한 이미지를 한 장 더 만들어 똑같이 쟀습니다.

거친 이미지 / quality 80용량
JPG약 268.8 KB
WebP약 272.9 KB
AVIF약 344.7 KB

부드러운 사진에서 가장 작았던 형식들이, 노이즈가 많은 이미지에서는 오히려 JPG와 비슷하거나 더 커졌습니다. 특히 AVIF는 앞 표에서 중간이었는데 여기서는 가장 컸습니다. 형식 사이의 용량 순위는 이미지 내용에 따라 통째로 뒤집힙니다.

이유는 압축 방식에 있습니다. WebP와 AVIF는 인접한 픽셀이 비슷하다고 예측해 그 차이만 저장하는 데 강합니다. 그래서 색이 부드러운 사진에서 위력을 냅니다. 반대로 픽셀마다 값이 제멋대로 튀는 노이즈 덩어리에서는 예측이 빗나가 이점이 줄고, 형식 간 차이도 좁아집니다.


같은 quality 80이라고 같은 화질이 아닙니다

이 비교에서 가장 조심할 점입니다. 위 표는 셋 다 quality를 80으로 맞췄지만, quality 숫자의 의미는 형식마다 다릅니다. JPG의 80과 WebP의 80, AVIF의 80은 서로 다른 압축기가 쓰는 별개의 눈금입니다.

즉 같은 숫자로 저장해도 실제 화질은 형식마다 다를 수 있습니다. WebP가 가장 작게 나온 데에는 같은 품질값에서 화질을 조금 더 양보했을 가능성도 섞여 있습니다. 그래서 "용량이 작다"는 곧 "더 좋다"가 아니라, 화질을 눈으로 확인한 뒤에 판단해야 합니다.

정리하면, 위 수치에서 안전하게 말할 수 있는 것은 정확한 배수가 아니라 방향입니다. 부드러운 사진에서는 WebP와 AVIF가 JPG보다 작아지는 경향이 있고, 거친 이미지에서는 그 이점이 줄거나 사라집니다.

직접 재현해 보고 싶다면

아래 파이썬 코드를 그대로 실행하면 위와 같은 부드러운 테스트 이미지를 만들고 세 형식으로 저장해 크기를 출력합니다. Pillow가 설치돼 있어야 하며, AVIF 저장은 Pillow 버전과 빌드에 따라 지원되지 않을 수 있습니다.

import os, math, random
from PIL import Image, ImageFilter

random.seed(42)
W, H = 1280, 853
img = Image.new("RGB", (W, H))
px = img.load()
for y in range(H):
    for x in range(W):
        r = int(40 + (x / W) * 180)
        g = int(60 + (y / H) * 150)
        b = int(120 + math.sin(x / 120.0) * 50 + math.cos(y / 100.0) * 35)
        n = random.randint(-10, 10)
        px[x, y] = (max(0, min(255, r + n)),
                    max(0, min(255, g + n)),
                    max(0, min(255, b + n)))
img = img.filter(ImageFilter.GaussianBlur(1.2))

for q in (70, 80, 90):
    for fmt, ext in [("JPEG", "jpg"), ("WEBP", "webp"), ("AVIF", "avif")]:
        path = f"q{q}.{ext}"
        img.save(path, fmt, quality=q)
        print(q, ext, os.path.getsize(path), "bytes")

seed를 42로 고정했으니 같은 환경이라면 비슷한 크기가 나옵니다. 다만 이 측정은 사람이 찍은 진짜 사진이 아니라 합성 이미지 기준이라는 한계가 있습니다. 실제 풍경, 인물, 텍스트 스크린샷은 화소 분포가 달라 숫자도 달라집니다. 위 결과는 경향을 보기 위한 것이지, 모든 사진에 그대로 적용되는 고정 비율이 아닙니다.


그래서 무엇을 언제 쓰면 될까

이럴 때이 형식
어디서든 무조건 열려야 하는 호환성 최우선JPG
웹 페이지 로딩 속도, 용량 절감이 목표WebP
최신 브라우저 대상, 더 높은 압축을 노릴 때AVIF
투명 배경이 필요한 사진형 이미지WebP 또는 AVIF

JPG는 거의 모든 프로그램과 기기에서 열리는 가장 안전한 형식입니다. WebP는 호환성과 압축률의 균형이 좋아 웹에서 널리 쓰이고, AVIF는 더 강한 압축을 노리되 지원 환경을 먼저 확인해야 합니다.

자주 묻는 질문

Q. 그럼 WebP가 AVIF보다 항상 작은가요?
아닙니다. 위 측정에서도 이미지 종류에 따라 순위가 바뀌었습니다. 같은 품질값이라도 화질 기준이 형식마다 달라, 어느 쪽이 작을지는 사진마다 직접 비교해야 정확합니다.

Q. quality 90이면 화질 손실이 없는 건가요?
아닙니다. 90도 손실 압축이라 원본과 미세하게 다릅니다. 손실이 전혀 없어야 한다면 PNG 같은 무손실 형식을 고려해야 합니다.

Q. 용량이 작은 형식으로 바꾸면 무조건 이득인가요?
받는 사람이나 브라우저가 그 형식을 열지 못하면 의미가 없습니다. 용량 절감과 호환성을 함께 따져야 합니다.

 

형식 하나로 용량을 줄일 수 있는 건 맞지만, 줄어드는 정도와 순위는 사진의 결에 따라 달라집니다. 그래서 가장 정확한 답은 본인 사진 한 장을 직접 세 형식으로 저장해 크기와 화질을 나란히 비교해 보는 것입니다.