소개
WebP는 (i) VP8 키 프레임 인코딩 중 하나를 사용하여 손실 있는 방식으로 이미지 데이터를 압축하거나 (ii) WebP 무손실 인코딩을 사용해야 합니다. 이러한 인코딩 스킴은 JPEG 같은 이전 형식보다 더 효율적이어야 GIF, PNG입니다. 네트워크를 통한 빠른 이미지 전송에 최적화되어 있으며 예: 웹사이트의 경우). WebP 형식은 다른 형식과 기능 패리티(색상 프로필, 메타데이터, 애니메이션 등)가 있습니다. 이 문서에서는 WebP 파일의 구조를 설명합니다.
WebP 컨테이너(즉, WebP용 RIFF 컨테이너)를 사용하면 WebP의 기본 사용 사례(즉, VP8 키 프레임으로 인코딩된 단일 이미지가 포함된 파일) 외에도 기능을 지원할 수 있습니다. WebP 컨테이너는 다음을 추가로 지원합니다.
무손실 압축: WebP 무손실 형식을 사용하여 이미지를 무손실 압축할 수 있습니다.
메타데이터: 이미지에 교환 가능한 이미지 파일 형식(Exif) 또는 확장 가능한 메타데이터 플랫폼(XMP) 형식으로 저장된 메타데이터가 있을 수 있습니다.
투명도: 이미지에 투명도(알파 채널)가 있을 수 있습니다.
색상 프로필: 이미지에는 국제 색상 협회에서 설명한 대로 삽입된 ICC 프로필이 있을 수 있습니다.
애니메이션: 이미지에는 여러 프레임이 있을 수 있으며 그 사이에 일시중지가 있습니다. 애니메이션을 만듭니다.
이름 지정
WebP 컨테이너를 참조할 때는 다음 유형을 사용하는 것이 좋습니다.
컨테이너 형식 이름 | WebP |
파일 이름 확장자 | .webp |
MIME 유형 | 이미지/webp |
Uniform Type 식별자 | org.webmproject.webp |
용어 및 기본사항
키워드에는 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', 'MAY', 'OPTIONAL' 이 BCP 14 RFC 2119 RFC 8174에 설명된 대로 해석되어야 합니다. 여기 보이는 것처럼 전부 대문자로 표시할 수 있습니다.
WebP 파일에는 정적 이미지 (즉, 픽셀의 인코딩된 매트릭스) 또는 애니메이션일 수 있습니다. 원하는 경우 투명도를 포함하여 정보, 색상 프로필 및 메타데이터로 구성됩니다. 픽셀 행렬을 이미지의 캔버스라고 합니다.
청크 다이어그램의 비트 번호 지정은 최상위 비트의 0
에서 시작함
('MSB 0'). RFC 1166에 설명되어 있습니다.
다음은 이 문서 전체에서 사용되는 추가 용어입니다.
- 리더/작성자
- WebP 파일을 읽는 코드를 리더라고 하며, 작성자라고 합니다.
- uint16
- 16비트, little-endian, 부호 없는 정수입니다.
- uint24
- 24비트, little-endian, 부호 없는 정수입니다.
- uint32
- 부호 없는 32비트 little-endian 정수입니다.
- FourCC
- 4자리 코드(FourCC)는 4개의 ASCII 문자를 little-endian 순서로 연결하여 만든 uint32입니다. 즉, 'aaaa'(0x61616161)와 'AAAA'(0x41414141)는 서로 다른 FourCC로 취급됩니다.
- 1기반
-1
로 오프셋된 값을 저장하는 부호 없는 정수 필드입니다. 예를 들어 이러한 필드는 값 25를 24로 저장합니다.- ChunkHeader('ABCD')
- 개별 청크의 FourCC 및 청크 크기 헤더를 설명하는 데 사용됩니다. 여기서 'ABCD'는 청크의 FourCC입니다. 이 요소의 크기는 8바이트입니다.
RIFF 파일 형식
WebP 파일 형식은 RIFF(리소스 교환 파일 형식) 문서 형식을 기반으로 합니다.
RIFF 파일의 기본 요소는 청크입니다. 다음으로 구성됩니다.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk FourCC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Chunk Payload :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 청크 FourCC: 32비트
- 청크 식별에 사용되는 ASCII 4자리 코드입니다.
- 청크 크기: 32비트 (uint32)
- 이 필드, 청크 식별자 또는 패딩을 제외한 청크의 크기(바이트)입니다.
- 청크 페이로드: 청크 크기 바이트
- 데이터 페이로드. 청크 크기가 홀수인 경우 단일 패딩 바이트입니다(MUST).
RIFF에 맞게
0
이 됩니다.
참고: RIFF에는 모든 대문자 청크 FourCC가 모든 RIFF 파일 형식에 적용되는 표준 청크이고 파일 형식에만 해당하는 FourCC는 모두 소문자라는 규칙이 있습니다. WebP는 이 규칙을 따르지 않습니다.
WebP 파일 헤더
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 'R' | 'I' | 'F' | 'F' |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| File Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 'W' | 'E' | 'B' | 'P' |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 'RIFF': 32비트
- ASCII 문자 'R', 'I', 'F', 'F'.
- 파일 크기: 32비트(uint32)
- 오프셋 8부터 시작하는 파일 크기(바이트)입니다. 이 이 필드는 2^32에서 10바이트를 뺀 값이므로 전체 파일의 크기는 다음과 같습니다. 최대 4GiB에서 2바이트를 뺀 값입니다.
- 'WEBP': 32비트
- ASCII 문자 'W', 'E', 'B', 'P'.
WebP 파일은 FourCC 'WEBP'가 있는 RIFF 헤더로 시작해야 합니다(MUST). 파일 크기
헤더는 그 뒤에 오는 청크의 총 크기에 다음 각 항목의 4
바이트를 더한 값입니다.
'WEBP' FourCC 파일에는 파일 크기로 지정된 데이터 뒤에 데이터가 포함되어서는 안 됩니다. 판독기는 이러한 파일을 파싱할 수 있으며 후행을 무시할 수 있습니다(MAY).
데이터입니다. 모든 청크의 크기는 짝수이므로 RIFF 헤더에 지정된 크기는
할 수도 있습니다. 개별 청크의 콘텐츠는 다음에 설명되어 있습니다.
섹션으로 이동합니다.
간단한 파일 형식 (손실형)
이미지에 손실 인코딩이 필요하지만 그렇지 않은 경우 이 레이아웃을 사용해야 합니다(SHOULD). 확장 형식에서 제공하는 투명도 또는 기타 고급 기능이 필요한 경우 이 레이아웃의 파일은 크기가 더 작으며 이전 소프트웨어에서 지원됩니다.
간단한 WebP(손실) 파일 형식:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| WebP file header (12 bytes) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: 'VP8 ' Chunk :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
'VP8' 청크:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8 ') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: VP8 data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- VP8 데이터: 청크 크기 바이트
- VP8 비트스트림 데이터입니다.
'VP8 '의 네 번째 문자는 FourCC는 ASCII 공백 (0x20)입니다.
VP8 비트스트림 형식 사양은 VP8 데이터 형식 및 디코딩 가이드를 참조하세요. VP8 프레임 헤더에 VP8 프레임이 포함되어 있습니다. 지정할 수 있습니다. 이는 캔버스의 너비와 높이로 가정됩니다.
VP8 사양에서는 이미지를 Y'CbCr 형식으로 디코딩하는 방법을 설명합니다. RGB로 변환하려면 권장사항 BT.601을 사용해야 합니다. 애플리케이션은 다른 변환 방법을 사용하지만 시각적 결과는 디코더마다 다를 수 있습니다.
단순 파일 형식 (무손실)
참고: 이전 리더는 무손실 형식을 사용하는 파일을 지원하지 않을 수 있습니다.
이미지에 무손실 인코딩( 투명성 채널(선택사항)이며 고급 기능이 필요하지 않습니다. 할 수 있습니다.
간단한 WebP (무손실) 파일 형식:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| WebP file header (12 bytes) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: 'VP8L' Chunk :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
'VP8L' 청크:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8L') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: VP8L data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- VP8L 데이터: 청크 크기 바이트
- VP8L 비트스트림 데이터
VP8L 비트스트림의 현재 사양은 WebP 무손실 비트스트림 형식. VP8L 헤더는 VP8L 이미지 너비와 높이를 포함합니다. 이는 캔버스의 너비와 높이로 가정됩니다.
확장된 파일 형식
참고: 오래된 리더의 경우 확장 형식을 사용하는 파일을 지원하지 않을 수 있습니다.
확장 형식 파일은 다음으로 구성됩니다.
파일에 사용된 기능에 관한 정보가 포함된 'VP8X' 청크입니다.
선택사항인 'ICCP' 색상 프로필이 있는 청크
'ANIM'(선택사항) 애니메이션 제어 데이터가 있는 청크
이미지 데이터
'EXIF'(선택사항) Exif 메타데이터가 포함된 청크
XMP 메타데이터가 포함된 선택적 'XMP' 청크입니다.
알 수 없는 청크의 선택적 목록입니다.
정지 이미지의 경우 이미지 데이터는 다음으로 구성된 단일 프레임으로 구성됩니다.
선택적 알파 하위 청크입니다.
애니메이션 이미지의 경우 이미지 데이터는 여러 프레임으로 구성됩니다. 더보기 프레임에 대한 세부정보는 애니메이션 섹션에서 확인할 수 있습니다.
재구성 및 색상 보정에 필요한 모든 청크('VP8X')를 'ICCP', 'ANIM', 'ANMF', 'ALPH', 'VP8' 'VP8L'은 순서대로 표시되어야 합니다. 사용할 수 있습니다. 재구성에 필요한 청크가 있으면 판독기가 실패해야 합니다(SHOULD). 색상 보정이 제대로 작동하지 않습니다.
메타데이터 및 알 수 없는 청크는 다음 위치에 나타날 수 있습니다(MAY). 있습니다.
사유: 재구성에 필요한 청크는 이 파일을 가져와서 리더가 이미지를 디코딩하기 시작할 수 있게 하고 데이터를 얻을 수 있습니다. 애플리케이션에는 다양한 메타데이터 순서와 맞춤 청크를 만듭니다.
확장된 WebP 파일 헤더:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| WebP file header (12 bytes) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8X') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv|I|L|E|X|A|R| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Canvas Width Minus One | ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... Canvas Height Minus One |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 예약됨(Rsv): 2비트
- 는
0
여야 합니다. 독자는 이 필드를 무시해야 합니다. - ICC 프로필 (I): 1비트
- 파일에 'ICCP'가 포함되어 있는지 설정합니다. 청크.
- 알파 (L): 1비트
- 이미지 프레임 중 투명도 정보를 포함하는 프레임이 있는지 설정 ('alpha')
- Exif 메타데이터(E): 1비트
- 파일에 Exif 메타데이터가 포함된 경우 설정합니다.
- XMP 메타데이터(X): 1비트
- 파일에 XMP 메타데이터가 포함되어 있는지 설정합니다.
- 애니메이션(A): 1비트
- 애니메이션 이미지인 경우 설정합니다. 'ANIM'의 데이터 및 'ANMF' 청크는 사용됩니다.
- 예약됨 (R): 1비트
- 는
0
여야 합니다. 독자는 이 필드를 무시해야 합니다. - 예약됨: 24비트
- 는
0
여야 합니다(MUST). 독자는 이 필드를 무시해야 합니다. - 캔버스 너비에서 1을 뺀 값: 24비트
- 캔버스의 1부터 시작 너비(픽셀)입니다.
실제 캔버스 너비는
1 + Canvas Width Minus One
입니다. - 캔버스 높이 - 1: 24비트
- 캔버스의 1 기반 높이(픽셀)입니다.
실제 캔버스 높이는
1 + Canvas Height Minus One
입니다.
캔버스 너비와 캔버스 높이의 곱은 2^32 - 1
이하여야 합니다.
향후 사양에 더 많은 입력란이 추가될 수 있습니다. 알 수 없는 필드는 무시해야 합니다(MUST).
애니메이션
애니메이션은 'ANIM'으로 제어됨 및 'ANMF' 덩어리.
'ANIM' 청크:
애니메이션 이미지의 경우 이 청크에 전역 매개변수가 포함됩니다. 애니메이션을 적용할 수 있습니다.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ANIM') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Background Color |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Loop Count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 배경 색상: 32비트(uint32)
- 캔버스의 기본 배경 색상: [파란색, 녹색, 빨간색, 알파]
바이트 순서입니다. 이 색상은 캔버스의 사용되지 않은 공간을 채우는 데 사용될 수 있습니다(MAY).
프레임 주위에 있을 뿐만 아니라 첫 번째 프레임의 투명 픽셀도 포함됩니다.
배경 색상은 폐기 방법이
1
인 경우에도 사용됩니다.
참고:
배경색은 'VP8X'의 Alpha 플래그 청크가 설정되지 않았습니다.
뷰어 애플리케이션은 배경 색상 값을 힌트로 취급해야 하며(SHOULD) 반드시 사용할 필요는 없습니다.
캔버스는 각 루프가 시작될 때 지워집니다. 이를 위해 배경 색상을 사용할 수 있습니다.
- 루프 횟수: 16비트(uint16)
- 애니메이션을 반복할 횟수입니다.
0
인 경우 다음을 의미합니다. 빛을 발하고 있습니다.
이 청크는 'VP8X'의 Animation 플래그가 있는 경우 표시되어야 합니다(MUST). 청크가 설정되었습니다. Animation 플래그가 설정되지 않았고 이 청크가 있는 경우 무시되어야 합니다.
'ANMF' 청크:
애니메이션 이미지의 경우 이 청크에는 단일 프레임에 관한 정보가 포함됩니다. 애니메이션 플래그가 설정되지 않은 경우 이 청크가 없어야 합니다.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ANMF') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Frame X | ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... Frame Y | Frame Width Minus One ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... | Frame Height Minus One |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Frame Duration | Reserved |B|D|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Frame Data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 프레임 X: 24비트(uint24)
- 프레임 왼쪽 상단 모서리의 X 좌표는
Frame X * 2
입니다. - 프레임 Y: 24비트(uint24)
- 프레임 왼쪽 상단의 Y 좌표는
Frame Y * 2
입니다. - 프레임 너비에서 1을 뺀 값: 24비트(uint24)
- 프레임의 1부터 시작 너비입니다.
프레임 너비는
1 + Frame Width Minus One
입니다. - 프레임 높이 - 1: 24비트(uint24)
- 프레임의 1부터 시작 높이입니다.
프레임 높이는
1 + Frame Height Minus One
입니다. - 프레임 지속 시간: 24비트 (uint24)
- 다음 프레임을 표시하기 전에 대기할 시간입니다(단위: 1밀리초). 0 (및 종종 10 이하)의 프레임 지속 시간 해석은 정의하는 데 사용됩니다. 여러 도구와 브라우저에서 GIF와 비슷한 길이의 동영상 길이를 뜻합니다.
- 예약됨: 6비트
- 는
0
여야 합니다. 독자는 이 필드를 무시해야 합니다. - 혼합 방법(B): 1비트
현재 프레임의 투명한 픽셀을 이전 캔버스의 해당 픽셀과 혼합하는 방법을 나타냅니다.
0
: 알파 혼합을 사용합니다. 이전 프레임을 폐기한 후 캔버스의 현재 프레임을 렌더링합니다 (아래 참조). 현재 프레임에 알파 채널이 없는 경우 알파 값이 255라고 가정하여 직사각형을 효과적으로 대체합니다.1
: 혼합하지 않습니다. 이전 프레임을 폐기한 후 현재 프레임으로 덮인 직사각형을 덮어쓰기하여 현재 프레임을 캔버스에 렌더링합니다.
- 폐기 방법 (D): 1비트
캔버스에 표시된 후(다음 프레임을 렌더링하기 전) 현재 프레임을 처리하는 방법을 나타냅니다.
0
: 폐기하지 않습니다. 캔버스는 그대로 둡니다.1
: 배경 색상을 삭제합니다. 현재 프레임으로 덮인 캔버스의 직사각형을 'ANIM' 청크에 지정된 배경 색상으로 채웁니다.
참고:
프레임 삭제는 프레임 직사각형, 즉 프레임 X, 프레임 Y, 프레임 너비, 프레임 높이로 정의된 직사각형에만 적용됩니다. 캔버스 전체를 덮을 수도 있고 가릴 수도 있습니다.
알파 혼합:
각 R, G, B, A 채널이 8비트이고 RGB 채널이 알파로 사전 곱셈되지 않은 경우 'dst'를 'src'에 블렌딩하는 수식은 다음과 같습니다.
blend.A = src.A + dst.A * (1 - src.A / 255) if blend.A = 0 then blend.RGB = 0 else blend.RGB = (src.RGB * src.A + dst.RGB * dst.A * (1 - src.A / 255)) / blend.A
알파 블렌딩은 다음을 고려하여 선형 색상 공간에서 실행되어야 합니다(SHOULD). 이미지의 색상 프로필입니다. 색상 프로필이 없으면 표준 RGB(sRGB)를 가정해야 합니다. (sRGB도 감마가 약 2.2이므로 선형화되어야 함)
- 프레임 데이터: 청크 크기 바이트 -
16
다음으로 구성됩니다.
프레임의 선택적 알파 하위 청크입니다.
프레임의 비트스트림 서브청크입니다.
알 수 없는 청크의 목록(선택사항)입니다.
참고: 'ANMF'는 Frame Data는 페이로드로, RIFF 파일 형식에 설명된 대로 패딩된 청크를 반환합니다.
알파
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ALPH') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv| P | F | C | Alpha Bitstream... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 예약됨 (Rsv): 2비트
- 는
0
여야 합니다. 리더는 이 필드를 무시해야 합니다(MUST). - 전처리 (P): 2비트
이러한 정보 제공 비트는 압축 중에 실행된 사전 처리를 알리는 데 사용됩니다. 디코더는 이 정보를 사용하여 예를 들어 표시하기 전에 값을 디더링하거나 그라데이션을 부드럽게 할 수 있습니다.
0
: 사전 처리가 없습니다.1
: 레벨 감소.
디코더는 이 정보를 지정된 방식으로 사용할 필요가 없습니다.
- 필터링 방법 (F): 2비트
사용되는 필터링 방법은 다음과 같습니다.
0
: 없음1
: 가로 필터입니다.2
: 세로 필터3
: 그라데이션 필터
각 픽셀에 대해 다음 계산을 사용하여 필터링이 실행됩니다.
현재 X
위치를 둘러싼 알파 값이 다음과 같이 라벨이 지정되었다고 가정합니다.
C | B |
---+---+
A | X |
X
위치의 알파 값을 계산합니다. 먼저 필터링 방법에 따라 예측이 실행됩니다.
- 메서드
0
: 예측자 = 0 - 메서드
1
: 예측자 = A - 메서드
2
: 예측자 = B - 메서드
3
: 예측자 = 클립(A + B - C)
여기서 clip(v)
는 다음과 같습니다.
- 0 if v < 0,
- v > 255인 경우 255
- v
최종 값은 압축 해제된 값 X
을
예측자를 사용하고 모듈로-256 산술을 사용하여 [256..511] 범위를 래핑합니다.
[0..255] 1로 변환합니다.
alpha = (predictor + X) % 256
맨 왼쪽 및 맨 위 픽셀 위치에는 특수한 경우가 있습니다. 대상 예를 들어 위치 (0, 0)의 왼쪽 상단 값은 예측자 값으로 0을 사용합니다. 그 이외의 경우
- 수평 또는 그라데이션 필터링 방법의 경우 위치 (0, y)는 바로 위의 위치 (0, y-1)를 사용하여 예측됩니다.
- 수직 또는 그라데이션 필터링 방법의 경우 위치 (x, 0)는 왼쪽의 위치 (x-1, 0)를 사용하여 예측됩니다.
- 압축 방법 (C): 2비트
사용된 압축 방법:
0
: 압축이 적용되지 않습니다.1
: WebP 무손실 형식을 사용하여 압축되었습니다.
- 알파 비트스트림: 청크 크기 바이트 -
1
인코딩된 알파 비트스트림
이 선택적 청크에는 이 프레임의 인코딩된 알파 데이터가 포함됩니다. 'VP8L' 청크가 포함된 프레임에는 이 청크가 포함되어서는 안 됩니다(SHOULD NOT).
근거: 투명도 정보는 이미 'VP8L' 청크의 일부입니다.
알파 채널 데이터는 비압축 원시 데이터(압축 방법이 '0'인 경우)로 저장되거나 무손실 형식을 사용하여 압축됩니다(압축 방법이 '1'인 경우).
원시 데이터: 길이 = 너비 * 높이의 바이트 시퀀스로 구성됩니다. 모든 8비트 투명도 값을 스캔 순서대로 포함합니다.
무손실 형식 압축: 바이트 시퀀스는 암시적 크기 너비 x 높이의 압축된 이미지 스트림입니다('WebP 무손실 비트스트림 형식' 참고). 즉, 이 이미지 스트림에는 이미지 크기를 설명하는 헤더가 포함되지 않습니다.
사유: 측정기준이 이미 다른 소스에서 알려져 있습니다. 다시 저장하면 중복되고 오류가 발생하기 쉽습니다.
이미지 스트림이 알파, 빨간색, 녹색, 파란색 (ARGB) 색상으로 디코딩되면 무손실 형식에서 설명한 프로세스에 따라 필요한 경우 투명도 정보는 녹색 채널을 사용합니다.
근거: 녹색 채널은 다른 채널과 달리 사양에서 압축을 개선할 수 있는 추가 변환 단계가 허용됩니다.
비트스트림(VP8/VP8L)
이 청크에는 단일 프레임의 압축된 비트스트림 데이터가 포함됩니다.
비트스트림 청크는 (i) 'VP8'일 수 있습니다. 청크, 'VP8 ' 사용 (참고: 중요한 4자 공백) 또는 (ii) 'VP8L' 청크, 'VP8L' 사용 FourCC로 설정했습니다.
'VP8 '의 형식 'VP8L' 청크는 섹션에 설명된 대로 간단한 파일 형식 (손실형) 및 Simple File Format (무손실)입니다.
색상 프로필
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ICCP') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Color Profile :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 색상 프로필: 청크 크기 바이트
- ICC 프로필
이 청크는 이미지 데이터 앞에 표시되어야 합니다.
이러한 청크는 최대 1개 있어야 합니다(SHOULD). 이러한 청크가 더 있는 경우 리더는 첫 번째 청크를 제외한 모든 청크를 무시할 수 있습니다. 자세한 내용은 ICC 사양을 참조하세요.
이 청크가 없는 경우 sRGB를 가정해야 합니다(SHOULD).
메타데이터
메타데이터는 'EXIF'에 저장될 수 있습니다. 또는 'XMP ' 덩어리.
각 유형('EXIF' 및 'XMP')마다 최대 1개의 청크가 있어야 합니다(SHOULD). 만약 이러한 청크인 경우, 리더는 첫 번째 청크를 제외한 모든 청크를 무시할 수 있습니다(MAY).
청크는 다음과 같이 정의됩니다.
'EXIF' 청크:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('EXIF') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Exif Metadata :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Exif 메타데이터: 청크 크기 바이트
- Exif 형식의 이미지 메타데이터입니다.
'XMP ' 청크:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('XMP ') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: XMP Metadata :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- XMP 메타데이터: 청크 크기 바이트
- XMP 형식의 이미지 메타데이터입니다.
'XMP '의 네 번째 문자는 FourCC는 ASCII 공백 (0x20)입니다.
메타데이터 처리에 관한 추가 안내는 메타데이터 작업 그룹의 '메타데이터 처리 가이드라인'을 참고하세요.
알 수 없는 청크
FourCC가 이 문서에 설명된 청크와 다른 RIFF 청크(RIFF 파일 형식 섹션에 설명됨)는 알 수 없는 청크로 간주됩니다.
사유: 알 수 없는 청크를 허용하면 향후 확장을 위한 프로비저닝이 제공됩니다. 모든 애플리케이션별 데이터를 저장할 수 있습니다.
파일에는 알 수 없는 청크가 포함될 수 있습니다(MAY).
- (확장된 WebP 파일 참조) header 섹션 또는
- 'ANMF' 끝부분 청크는 애니메이션 섹션을 참조하세요.
판독기는 이러한 청크를 무시해야 합니다. 작성자는 (이 청크를 수정할 의도가 없는 경우)
프레임에서 캔버스 조립
다음은 애니메이션 이미지의 경우 리더가 캔버스를 조합해야 하는 방법을 간략하게 설명합니다.
이 프로세스는 'VP8X' 청크에 지정된 크기(너비 Canvas Width Minus One + 1
픽셀, 높이 Canvas Height Minus
One + 1
픽셀)를 사용하여 캔버스를 만드는 것으로 시작됩니다. 'ANIM'의 Loop Count
필드 청크는
여러 번 반복할 수 있습니다. Loop Count - 1
입니다.
0이 아닌 Loop Count
값 또는 Loop Count
가 0인 경우 무한합니다.
각 루프 반복이 시작될 때 캔버스는 'ANIM' 청크의 배경 색상 또는 애플리케이션 정의 색상을 사용하여 채워집니다.
'ANMF' 청크에는 표시 순서대로 지정된 개별 프레임이 포함됩니다. 렌더링 전
각 프레임에 이전 프레임의 Disposal method
가 적용됩니다.
디코딩된 프레임의 렌더링은 캔버스의 왼쪽 상단 모서리를 원점으로 사용하여 데카르트 좌표(2 *
Frame X
, 2 * Frame Y
)에서 시작합니다.
가로 Frame Width Minus One + 1
픽셀, 가로 Frame Height Minus One + 1
픽셀
Blending method
를 사용하여 캔버스에 렌더링됩니다.
캔버스가 Frame Duration
밀리초 동안 표시됩니다. 이는 'ANMF' 청크에서 제공된 모든 프레임이 표시될 때까지 계속됩니다. 그런 다음 새 루프 반복이 시작되거나 모든 반복이 완료된 경우 캔버스가 최종 상태로 유지됩니다.
다음 의사 코드는 렌더링 프로세스를 보여줍니다. VP8X.field 표기는 'VP8X' 청크의 설명이 동일한 필드를 의미합니다.
VP8X.flags.hasAnimation MUST be TRUE
canvas ← new image of size VP8X.canvasWidth x VP8X.canvasHeight with
background color ANIM.background_color or
application-defined color.
loop_count ← ANIM.loopCount
dispose_method ← Dispose to background color
if loop_count == 0:
loop_count = ∞
frame_params ← nil
next chunk in image_data is ANMF MUST be TRUE
for loop = 0..loop_count - 1
clear canvas to ANIM.background_color or application-defined color
until eof or non-ANMF chunk
frame_params.frameX = Frame X
frame_params.frameY = Frame Y
frame_params.frameWidth = Frame Width Minus One + 1
frame_params.frameHeight = Frame Height Minus One + 1
frame_params.frameDuration = Frame Duration
frame_right = frame_params.frameX + frame_params.frameWidth
frame_bottom = frame_params.frameY + frame_params.frameHeight
VP8X.canvasWidth >= frame_right MUST be TRUE
VP8X.canvasHeight >= frame_bottom MUST be TRUE
for subchunk in 'Frame Data':
if subchunk.tag == "ALPH":
alpha subchunks not found in 'Frame Data' earlier MUST be
TRUE
frame_params.alpha = alpha_data
else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L":
bitstream subchunks not found in 'Frame Data' earlier MUST
be TRUE
frame_params.bitstream = bitstream_data
apply dispose_method.
render frame with frame_params.alpha and frame_params.bitstream
on canvas with top-left corner at (frame_params.frameX,
frame_params.frameY), using Blending method
frame_params.blendingMethod.
canvas contains the decoded image.
Show the contents of the canvas for
frame_params.frameDuration * 1 ms.
dispose_method = frame_params.disposeMethod
파일 레이아웃 예
알파가 있는 손실 압축 이미지는 다음과 같이 표시될 수 있습니다.
RIFF/WEBP
+- VP8X (descriptions of features used)
+- ALPH (alpha bitstream)
+- VP8 (bitstream)
무손실 인코딩된 이미지는 다음과 같이 표시될 수 있습니다.
RIFF/WEBP
+- VP8X (descriptions of features used)
+- VP8L (lossless bitstream)
+- XYZW (unknown chunk)
ICC 프로필과 XMP 메타데이터가 포함된 무손실 이미지는 다음과 같이 표시될 수 있습니다.
RIFF/WEBP
+- VP8X (descriptions of features used)
+- ICCP (color profile)
+- VP8L (lossless bitstream)
+- XMP (metadata)
Exif 메타데이터를 포함한 애니메이션 이미지는 다음과 같습니다.
RIFF/WEBP
+- VP8X (descriptions of features used)
+- ANIM (global animation parameters)
+- ANMF (frame1 parameters + data)
+- ANMF (frame2 parameters + data)
+- ANMF (frame3 parameters + data)
+- ANMF (frame4 parameters + data)
+- EXIF (metadata)