WebP 형식
Google이 만든 최신 이미지 형식
RIFF 컨테이너
Google은 WebP를 위해 새 컨테이너를 만들지 않았어요. 90년대 초부터 WAV 오디오와 AVI 비디오를 담아 온 RIFF를 그대로 가져다 썼습니다. WAV 파일을 파싱해 본 적이 있다면, 컨테이너 수준에서 WebP가 어떻게 돌아가는지 이미 아는 셈이에요.
이 형식은 4글자 식별자(FourCC 코드라고 불러요)를 가진 chunk를 겹겹이 쌓아 씁니다. 단순하고 튼튼해서 오랜 세월을 버텨 온 설계예요.
WebP 파일 구조 (RIFF 컨테이너)
WebP 헤더
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 52494646241A00005745425056503858 | RIFF$...WEBPVP8X | |||||||||||||||
| 0010 | 0A00000010000000FF0000FF00000000 | .............. | |||||||||||||||
RIFF chunk의 구조
참고: 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를 지울 때는 이 플래그도 같이 고쳐야 해요. 그러지 않으면 디코더가 없는 데이터를 찾게 됩니다.
플래그 비트
플래그가 중요한 이유
PicScrub이 EXIF/XMP chunk를 지울 때는 VP8X 플래그도 함께 고쳐서 이제 그 데이터가 없다는 걸 반영해야 합니다. 그러지 않으면 디코더가 없는 데이터를 기대할 수 있어요.
PicScrub이 WebP를 처리하는 방법
RIFF 헤더 확인
RIFF....WEBP 시그니처가 맞는지 검사합니다
chunk 파싱
모든 RIFF chunk를 돌면서 FourCC와 크기를 읽습니다
메타데이터 chunk 제거
결과를 쓸 때 EXIF와 XMP chunk를 건너뜁니다
VP8X 플래그 갱신
VP8X chunk의 EXIF/XMP 플래그 비트를 0으로 되돌립니다
파일 크기 다시 계산
새 전체 파일 크기로 RIFF 헤더를 갱신합니다
남는 것
- • VP8/VP8L 이미지 데이터
- • ALPH 알파 채널
- • ANIM/ANMF 애니메이션 데이터
- • ICCP 색상 프로필 (선택 사항)
지워지는 것
- • EXIF 메타데이터
- • XMP 메타데이터
단순 WebP와 확장 WebP
WebP 파일에 VP8X chunk가 없다면 "단순" WebP입니다. VP8이나 VP8L chunk 하나를 RIFF로 감싼 게 전부예요. 단순 WebP에는 메타데이터가 들어갈 수 없으니, 프라이버시를 신경 쓴다면 가장 이상적입니다.
단순 WebP
VP8 또는 VP8L chunk만 들어 있습니다. 메타데이터는 들어갈 수 없어요.
확장 WebP
VP8X chunk가 있어서 메타데이터, 알파, 애니메이션을 쓸 수 있어요.