PicScrub logoPicScrub
형식 목록으로 돌아가기

WebP 형식

Google이 만든 최신 이미지 형식

RIFF 컨테이너

Google은 WebP를 위해 새 컨테이너를 만들지 않았어요. 90년대 초부터 WAV 오디오와 AVI 비디오를 담아 온 RIFF를 그대로 가져다 썼습니다. WAV 파일을 파싱해 본 적이 있다면, 컨테이너 수준에서 WebP가 어떻게 돌아가는지 이미 아는 셈이에요.

이 형식은 4글자 식별자(FourCC 코드라고 불러요)를 가진 chunk를 겹겹이 쌓아 씁니다. 단순하고 튼튼해서 오랜 세월을 버텨 온 설계예요.

WebP 파일 구조 (RIFF 컨테이너)

RIFF
Size
WEBP
VP8X
EXIF/XMP
VP8/VP8L
RIFF
4바이트
컨테이너 시그니처
Size
4바이트
파일 크기 - 8
WEBP
4바이트
형식 식별자
VP8X
18바이트
확장 기능 플래그
EXIF/XMP
100바이트
메타데이터 chunk
VP8/VP8L
가변 길이
이미지 데이터

WebP 헤더

RIFF 시그니처
파일 크기 - 8
WEBP 식별자
VP8X chunk 종류
VP8X 크기 (10)
VP8X 플래그
캔버스 크기
OffsetHexASCII
0000
52494646241A00005745425056503858
RIFF$...WEBPVP8X
0010
0A00000010000000FF0000FF00000000
..............

RIFF chunk의 구조

FourCCSizeData
4바이트4바이트 (LE)가변

참고: chunk 데이터는 필요하면 null 바이트를 붙여 짝수 길이로 맞춥니다.

주요 오프셋

  • • 서브 chunk 시작: 12바이트 (RIFF + 크기 + WEBP 다음)
  • • chunk 헤더: 8바이트 (FourCC 4바이트 + 크기 4바이트)
  • • 크기 필드 위치: chunk 시작에서 +4 (리틀엔디언)

이미지 chunk

WebP는 사실 형식 세 개가 하나로 묶인 것이에요. 손실 압축(VP8), 무손실 압축(VP8L), 확장(VP8X)이죠. chunk 종류를 보면 어떤 압축 방식을 썼는지 알 수 있습니다.

VP8:손실 압축

VP8 비디오 코덱으로 압축합니다. 화질 대비 용량이 JPEG과 비슷해요. 단순한 WebP 파일에는 이 chunk만 들어 있습니다.

VP8L:무손실 압축

예측, 색 변환, 엔트로피 부호화를 쓰는 무손실 압축입니다. 보통 PNG보다 25-34% 작아요.

VP8X:확장 형식

애니메이션, 알파 채널, ICC 프로필, EXIF, XMP 같은 선택 기능이 들어 있는지를 알려 줍니다. 이런 기능이 하나라도 있으면 반드시 필요해요.

ALPH:알파 채널

별도로 저장되는 알파 채널 데이터입니다. 색 데이터와 무관하게 무손실 또는 손실로 압축할 수 있어요.

ANIM/ANMF:애니메이션

ANIM에는 전체 애니메이션 설정이, ANMF chunk에는 타이밍 정보와 함께 각 프레임이 들어 있습니다.

메타데이터 chunk

이미지 데이터만 담는 단순한 WebP와 달리, 확장 WebP 파일에는 메타데이터가 들어갈 수 있습니다. 다행인 건 이 chunk들이 이미지 데이터와 깔끔하게 분리되어 있어서 찾아내고 지우기 쉽다는 점이에요.

EXIF:EXIF 메타데이터

JPEG과 똑같은 형식(TIFF 구조 그대로)의 EXIF 데이터가 들어 있습니다. 카메라 정보, GPS 좌표, 촬영 시각, 썸네일이 포함돼요. 프라이버시 측면에서 가장 문제가 되는 부분이에요.

XMP:XMP 메타데이터

XML 기반 메타데이터입니다. EXIF와 겹치는 내용에 더해 편집 이력, 소프트웨어 정보, 사용자 정의 필드가 들어갈 수 있어요.

ICCP:ICC 색상 프로필

색 관리를 위한 ICC 색상 프로필입니다. PicScrub은 색이 정확하게 보이도록 기본적으로 남겨 둡니다.

VP8X 플래그

VP8X chunk는 일종의 목차라서, 디코더에게 파일 안에 무엇이 있는지 알려 줍니다. 메타데이터 chunk를 지울 때는 이 플래그도 같이 고쳐야 해요. 그러지 않으면 디코더가 없는 데이터를 찾게 됩니다.

플래그 비트

Bit 0예약됨 (반드시 0)
Bit 1애니메이션 플래그
Bit 2XMP 메타데이터 있음
Bit 3EXIF 메타데이터 있음
Bit 4알파 채널 있음
Bit 5ICC 프로필 있음

플래그가 중요한 이유

PicScrub이 EXIF/XMP chunk를 지울 때는 VP8X 플래그도 함께 고쳐서 이제 그 데이터가 없다는 걸 반영해야 합니다. 그러지 않으면 디코더가 없는 데이터를 기대할 수 있어요.

PicScrub이 WebP를 처리하는 방법

1

RIFF 헤더 확인

RIFF....WEBP 시그니처가 맞는지 검사합니다

2

chunk 파싱

모든 RIFF chunk를 돌면서 FourCC와 크기를 읽습니다

3

메타데이터 chunk 제거

결과를 쓸 때 EXIF와 XMP chunk를 건너뜁니다

4

VP8X 플래그 갱신

VP8X chunk의 EXIF/XMP 플래그 비트를 0으로 되돌립니다

5

파일 크기 다시 계산

새 전체 파일 크기로 RIFF 헤더를 갱신합니다

남는 것

  • • VP8/VP8L 이미지 데이터
  • • ALPH 알파 채널
  • • ANIM/ANMF 애니메이션 데이터
  • • ICCP 색상 프로필 (선택 사항)

지워지는 것

  • • EXIF 메타데이터
  • • XMP 메타데이터

단순 WebP와 확장 WebP

WebP 파일에 VP8X chunk가 없다면 "단순" WebP입니다. VP8이나 VP8L chunk 하나를 RIFF로 감싼 게 전부예요. 단순 WebP에는 메타데이터가 들어갈 수 없으니, 프라이버시를 신경 쓴다면 가장 이상적입니다.

단순 WebP

VP8 또는 VP8L chunk만 들어 있습니다. 메타데이터는 들어갈 수 없어요.

RIFF + WEBP + VP8/VP8L

확장 WebP

VP8X chunk가 있어서 메타데이터, 알파, 애니메이션을 쓸 수 있어요.

RIFF + WEBP + VP8X + [ICCP] + [ANIM] + [EXIF] + [XMP] + VP8/VP8L