WebP 컨테이너 사양

소개

WebP는 (i) VP8 키 프레임 인코딩 중 하나를 사용하여 손실 있는 방식으로 이미지 데이터를 압축하거나 (ii) WebP 무손실 인코딩을 사용해야 합니다. 이러한 인코딩 스킴은 JPEG 같은 이전 형식보다 더 효율적이어야 GIF, PNG입니다. 네트워크를 통한 빠른 이미지 전송에 최적화되어 있으며 예: 웹사이트의 경우). WebP 형식에는 기능 패리티 (색상 프로필, 메타데이터, 애니메이션 등)도 업로드할 수 있습니다. 이 문서에서는 다음을 설명합니다. WebP 파일의 구조와 일치해야 합니다.

WebP 컨테이너 (즉, WebP용 RIFF 컨테이너)는 WebP의 기본 사용 사례 (즉, 단일 API를 포함하는 파일)를 VP8 키프레임으로 인코딩된 이미지여야 합니다. WebP 컨테이너는 다음 지원이 제공됩니다.

  • 무손실 압축: 이미지는 WebP 무손실 형식.

  • 메타데이터: 이미지에 교환 가능한 이미지 파일에 저장된 메타데이터가 있을 수 있음 형식 (Exif) 또는 확장 가능 메타데이터 플랫폼 (XMP) 형식.

  • 투명도: 이미지에 투명도(알파 채널)가 있을 수 있습니다.

  • 색상 프로필: 이미지에 설명된 대로 ICC 프로필이 삽입되어 있을 수 있습니다. 국제 색상 컨소시엄(International Color Consortium)에서 제공합니다.

  • 애니메이션: 이미지에는 여러 프레임이 있을 수 있으며 그 사이에 일시중지가 있습니다. 애니메이션으로 만듭니다.

이름 지정

WebP를 참조할 때 다음 유형을 사용하는 것이 좋습니다(RECOMMENDED). 컨테이너:

컨테이너 형식 이름WebP
파일 이름 확장자.webp
MIME 유형image/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개를 연결하여 만든 uint32입니다. 리틀 엔디언 순서의 ASCII 문자입니다. 이것은 'aaaa'를 의미합니다 (0x61616161) 및 'AAAA' (0x41414141)는 다른 FourCCs로 취급됩니다.
1기반
-1에 의한 값 오프셋을 저장하는 부호 없는 정수 필드. 예를 들면 다음과 같습니다. 필드는 25 값을 24로 저장합니다.
ChunkHeader('ABCD')
개별 청크의 FourCCChunk Size 헤더를 설명하는 데 사용됩니다. 여기서 'ABCD'는 청크의 FourCC입니다. 이 요소의 크기는 8바이트입니다.

RIFF 파일 형식

WebP 파일 형식은 RIFF (Resource Interchange File Format)를 기반으로 합니다. 문서 형식으로 볼 수 있습니다.

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 파일 형식에 적용되는 청크와 모두 소문자입니다. 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 파일은 데이터 이후의 데이터를 포함하면 안 됩니다(SHOULD NOT). File Size로 지정됩니다. 판독기는 이러한 파일을 파싱할 수 있으며 후행을 무시할 수 있습니다(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을 사용해야 합니다(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)                |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                         '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여야 합니다. 리더는 이 필드를 무시해야 합니다(MUST).
ICC 프로필 (I): 1비트
파일에 'ICCP'가 포함되어 있는지 설정합니다. 청크.
알파 (L): 1비트
이미지 프레임 중 투명도 정보를 포함하는 프레임이 있는지 설정 ('alpha')
Exif 메타데이터 (E): 1비트
파일에 Exif 메타데이터가 포함되어 있는지 설정합니다.
XMP 메타데이터 (X): 1비트
파일에 XMP 메타데이터가 포함되어 있는지 설정합니다.
애니메이션 (A): 1비트
애니메이션 이미지인 경우 설정합니다. 'ANIM'의 데이터 및 'ANMF' 청크는 사용됩니다.
예약됨 (R): 1비트
0여야 합니다. 리더는 이 필드를 무시해야 합니다(MUST).
예약됨: 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) 반드시 사용할 필요는 없습니다.

  • 각 루프가 시작될 때마다 캔버스가 지워집니다. 배경 색상은 다음과 같을 수 있습니다(MAY). 사용 사례를 살펴봤습니다

루프 수: 16비트 (uint16)
애니메이션을 반복 재생할 횟수입니다. 0인 경우 다음을 의미합니다. 빛을 발하고 있습니다.

이 청크는 'VP8X'의 Animation 플래그가 있는 경우 표시되어야 합니다(MUST). 청크가 설정되었습니다. Animation 플래그가 설정되지 않았고 이 청크가 있는 경우에는 다음과 같아야 합니다(MUST). 무시됩니다.

'ANMF' 청크:

애니메이션 이미지의 경우 이 청크에는 단일 프레임에 대한 정보가 포함됩니다. 애니메이션 플래그가 설정되지 않은 경우에는 이 청크가 있으면 안 됩니다(SHOULD NOT).

 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여야 합니다. 리더는 이 필드를 무시해야 합니다(MUST).
혼합 방법 (B): 1비트

현재 프레임의 투명 픽셀이 블렌딩되는 방식을 나타냅니다. 를 이전 캔버스의 해당 픽셀로 바꿉니다.

  • 0: 알파 혼합을 사용합니다. 이전 프레임을 폐기한 후 캔버스의 현재 프레임을 렌더링합니다 (아래 참조). 만약 현재 프레임에 알파 채널이 없고, 알파 값이 255의 배치를 사용하여 직사각형을 효과적으로 대체합니다.

  • 1: 혼합하지 않습니다. 이전 프레임을 폐기한 후 오버레이로 덮인 직사각형을 덮어써서 캔버스의 현재 프레임을 확인할 수 있습니다.

폐기 방법 (D): 1비트

현재 프레임이 처리된 후 처리되는 방법을 나타냅니다. 다음 프레임을 렌더링하기 전에)를 반환합니다.

  • 0: 폐기하지 않습니다. 캔버스를 그대로 둡니다.

  • 1: 배경 색상을 삭제합니다. 캔버스의 직사각형을 채웁니다. 지정된 배경색으로 현재 프레임에 가려집니다. 'ANIM' 청크.

참고:

  • 프레임 처리는 프레임 직사각형, 즉 프레임 X, 프레임 Y, 프레임 너비, 프레임으로 정의된 직사각형) 높이. 캔버스 전체를 덮을 수도 있고 가릴 수도 있습니다.

  • 알파 혼합:

    R, G, B, A 채널이 각각 8비트이고 RGB는 0인 12비트 채널에 블렌딩 공식인 알파가 미리 곱되지 않습니다. '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)는 다음과 같습니다.

  • v가 <인 경우 0 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'에 포함되어 있습니다. 청크.

알파 채널 데이터는 압축되지 않은 원시 데이터( 무손실 형식을 사용하여 압축하거나 (압축 방법이 '1'인 경우)

  • 원시 데이터: 길이 = 너비 * 높이의 바이트 시퀀스로 구성됩니다. 모든 8비트 투명도 값을 스캔 순서대로 포함합니다.

  • 무손실 형식 압축: 바이트 시퀀스는 압축된 형식의 이미지 스트림 ('WebP 무손실 비트스트림 형식'에 설명됨)을 포함해야 합니다. 다시 말해 image-stream에는 이미지 크기를 설명하는 헤더가 없습니다.

    사유: 측정기준이 이미 다른 소스에서 알려져 있습니다. 다시 저장하면 중복되고 오류가 발생하기 쉽습니다.

    이미지 스트림이 알파, 빨간색, 녹색, 파란색 (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 프로필

이 청크는 이미지 데이터 앞에 표시되어야 합니다(MUST).

이러한 청크는 최대 1개 있어야 합니다(SHOULD). 이러한 청크가 더 많으면 독자는 첫 번째 항목을 제외한 모든 항목을 무시할 수 있습니다(MAY). 자세한 내용은 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)입니다.

메타데이터 처리에 대한 추가 안내는 다음을 참고하세요. 메타데이터 작업 그룹의 '메타데이터 처리 가이드라인'

알 수 없는 청크

RIFF 청크 (RIFF 파일 형식 섹션에서 설명) 이 문서에 설명된 모든 청크와 다른 FourCC가 알 수 없는 청크로 간주됩니다.

사유: 알 수 없는 청크를 허용하면 향후 확장을 위한 프로비저닝이 제공됩니다. 모든 애플리케이션별 데이터를 저장할 수 있습니다.

파일에는 알 수 없는 청크가 포함될 수 있습니다(MAY).

판독기는 이러한 청크를 무시해야 합니다(SHOULD). 작성자는 (이 청크를 수정할 의도가 없는 경우)

프레임에서 캔버스 어셈블리

여기서는 리더가 케이스에 캔버스를 조립해야 하는 방법을 간략하게 설명합니다. 학습합니다.

이 과정은 표에 지정된 크기를 사용하여 캔버스를 만드는 것으로 시작됩니다. '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

파일 레이아웃 예

알파를 포함한 손실(lossy) 인코딩된 이미지는 다음과 같습니다.

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)