WebP 容器規格

簡介

WebP 是一種圖片格式,可使用 (i) VP8 關鍵影格編碼以有損方式壓縮圖片資料,或 (ii) WebP 無損編碼。這些編碼方案應比 JPEG、GIF 和 PNG 等舊格式更有效率。最適合透過網路快速傳輸圖片 ( 例如網站)。WebP 格式的功能一致 (色彩設定檔、 中繼資料、動畫等)。本文件說明 WebP 檔案的結構

WebP 容器 (即 WebP 的 RIFF 容器) 允許功能支援 可能大幅提高 WebP 基本用法 (也就是含有 編碼為 VP8 主要影格的圖片)。WebP 容器提供了額外的 支援下列項目:

  • 無損壓縮:使用 WebP 無損格式,可對圖片進行無損壓縮。

  • 中繼資料:圖片可能含有儲存在可交換影像檔案中的中繼資料 格式 (Exif) 或可擴充中繼資料平台 (XMP) 格式。

  • 不透明:圖片可能包含透明度,也就是 Alpha 管道。

  • 色彩設定檔:圖片可能會嵌入 國際色彩聯盟所述的 ICC 設定檔。

  • 動畫:圖片可能有多個影格,且各影格之間有暫停時間,因此屬於動畫。

命名

建議您在參照 WebP 容器時使用下列類型:

容器格式名稱WebP
副檔名.webp
MIME-type圖片/WebP
統一類型 IDorg.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 中所述。

以下是本文件中使用的附加條款:

Reader/Writer
讀取 WebP 檔案的程式碼稱為「讀取器」,而寫入 WebP 檔案的程式碼則稱為「寫入器」
uint16
16 位元小端序無符號整數。
uint24
24 位元小端序無符號整數。
uint32
32 位元的小端序整數。
FourCC
四字元代碼 (FourCC) 是透過以小端序連結四個 ASCII 字元所建立的 uint32。也就是說,系統會將「aaaa」(0x61616161) 和「AAAA」(0x41414141) 視為不同的 FourCC
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 四字元代碼。
區塊大小:32 位元 (uint32)
區塊大小 (以位元組為單位),不含此欄位、區塊 ID 或填充資料。
區塊酬載:Chunk Size 個位元組
資料酬載。如果「Chunk Size」為奇數,系統會新增單一填充位元組 (必須為 0,才能符合 RIFF 規範)。

注意: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 個位元組,因此整個檔案的大小都達到 最多 4 GiB 減去 2 個位元組。
「WEBP」:32 位元
ASCII 字元「W」、「E」、「B」、「P」。

WebP 檔案開頭必須是 RIFF 標頭,且 FourCC 為「WEBP」。標頭中的檔案大小是後續區塊的總大小,加上 'WEBP' FourCC 的 4 位元組。檔案「不可」包含資料後的任何資料 檔案大小。讀者可以剖析這類檔案,並忽略結尾 資料。如同任何區塊的大小,RIFF 標頭提供的大小是 甚至還能以下說明個別區塊的內容 專區。

簡易檔案格式 (Lossy)

如果圖片需要有損編碼,且不需要透明度或擴充格式提供的其他進階功能,則應使用此版面配置。採用這種版面的檔案較小,且舊版軟體也支援。

簡易 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 資料:Chunk Size 位元組
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 資料:Chunk Size 位元組
VP8L 位元流資料。

如要查看 VP8L 位元串流的目前規格,請參閱 WebP 無損位元串流格式。請注意,VP8L 標頭 包含 VP8L 圖片的寬度和高度。假設這會是畫布的寬度和高度。

擴充檔案格式

注意:舊版閱讀器可能不支援使用擴充格式的檔案。

擴充格式檔案包含:

  • 包含檔案中所用功能資訊的「VP8X」區塊。

  • 選用的「ICCP」區塊,其中包含色彩設定檔。

  • 可選的「ANIM」區塊,其中包含動畫控制項資料。

  • 圖片資料。

  • 選用的「EXIF」含有 EXIF 中繼資料的區塊。

  • 可選用的「XMP 」含有 XMP 中繼資料的區塊。

  • 選用的不明區塊清單。

如為靜態圖片圖片資料是由一個影格組成 最多:

如果是動畫圖片圖片資料由多個影格組成。更多內容 如要進一步瞭解影格,請參閱「Animation」一節。

重建和色彩校正所需的所有片段 (即 'VP8X'、'ICCP'、'ANIM'、'ANMF'、'ALPH'、'VP8' 和'VP8L') 必須依先前所述的順序出現。如果必須重新建構需要的區塊,讀取器就會失敗 和色彩校正順序錯誤。

中繼資料不明區塊 可能會顯示在錯誤順序。

理由:重建的必要區塊應該優先顯示 可讓讀取器在收到所有 實體媒介包括儲存空間陣列 傳統硬碟、磁帶和 USB 隨身碟等應用程式可能會根據實作方式,調整中繼資料和自訂區塊的順序。

擴充的 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 色彩描述檔:1 位元
設定檔案是否包含「ICCP」區塊。
Alpha (L):1 位元
如果圖片的任何影格含有透明度資訊 (「alpha」),請設定此屬性。
Exif 中繼資料 (E):1 位元
如果檔案包含 EXIF 中繼資料,請設定這個值。
XMP 中繼資料 (X):1 位元
設定檔案是否包含 XMP 中繼資料。
動畫 (A):1 位元
如果這是動畫圖片,請設定此屬性。「ANIM」中的資料和「ANMF」區塊應採用 可用於控制動畫
保留 (R):1 位元
必須為 0。讀者「必須」忽略這個欄位。
保留:24 位元
必須為 0。讀者必須忽略這個欄位。
畫布寬度減一:24 位元
以像素為單位的1 級寬度。 實際的畫布寬度為 1 + Canvas Width Minus One
無框畫高度減一:24 位元
以像素為單位的 1 型高度。 實際的畫布高度為 1 + Canvas Height Minus One

畫布寬度畫布高度的乘積不得超過 2^32 - 1

未來的規格可能會新增更多欄位。系統一律會忽略不明欄位。

動畫

動畫是由「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)
畫布的預設背景顏色 [藍色、綠色、紅色、Alpha 版] 依位元組順序排列這個顏色可用於填滿畫布上影格周圍未使用的空間,以及第一個影格的透明像素。當 Disposal 方法為 1 時,也會使用背景顏色。

注意事項

  • 背景顏色「可能」包含非不透明的 Alpha 值 「VP8X」中的 Alpha 版旗標未設定 Chunk

  • 檢視器應用程式應將背景顏色值視為提示 不一定要使用

  • 在每個迴圈開始時,畫布都會清除。您可以使用背景顏色來達成這項目標。

迴圈計數:16 位元 (uint16)
循環播放動畫的次數。如果值為 0,則代表 沒有限制

如果「VP8X」中的Animation 旗標,則「必須」出現這個區塊區塊已設定完成。 如果未設定 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
影格寬度減一:24 位元 (uint24)
從 1 開始的影格寬度。 頁框寬度為 1 + Frame Width Minus One
影格高度減一:24 位元 (uint24)
影格高度的以 1 為單位。 影格高度為 1 + Frame Height Minus One
影格時長:24 位元 (uint24)
顯示下一個影格前的等待時間,單位為 1 毫秒。 請注意,實作方式會定義 0 (通常 <= 10) 的 Frame Duration 解讀方式。許多工具和瀏覽器會指派與 GIF 相似的最低時間長度。
保留:6 位元
必須為 0。讀者必須忽略這個欄位。
混合方法 (B):1 位元

指出如何將目前影格的透明像素與前一個畫布的對應像素混合:

  • 0:使用 Alpha 混合。處理上一個影格後,請算繪 動畫效果會呈現在畫布目前的畫格上 (如下方所示)。如果目前的框架沒有 Alpha 通道,則假設 Alpha 值為 255,實際上會取代矩形。

  • 1:不混合。處置上一個影格後,請覆寫目前影格所覆蓋的矩形,在畫布上算繪目前影格。

處理方法 (D):1 位元

表示在經過目前的影格後,系統如何處理目前的影格 是否顯示在畫布上 (在轉譯下一個影格之前):

  • 0:請勿丟棄。讓畫布保持原狀。

  • 1:丟棄背景顏色。填滿畫布的矩形 包含在目前頁框中,所指定的背景顏色為 ANIM'區塊

注意事項

  • 影格處理動作僅適用於「頁框矩形」,也就是 由Frame XFrame Y頁框寬度頁框 高度。不一定會覆蓋整個畫布。

  • Alpha 混合:

    由於 R、G、B 和 A 管道均為 8 位元,且 RGB 管道不會被 Alpha 值前置;在這種情況下, 「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
    
  • 您應在線性色彩空間中進行 Alpha 混合,並考量圖片的色彩設定檔。如果顏色設定檔是 ,則假設使用的是標準 RGB (sRGB)。(請注意,由於伽瑪值約為 2.2,因此 sRGB 也需要線性化)。

影格資料:區塊大小位元組 - 16

組成元素包括:

注意:如RIFF 檔案格式所述,'ANMF' 酬載 (影格資料) 包含個別填充區塊。

Alpha 值

 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。讀者「必須」忽略這個欄位。
預先處理 (P):2 位元

這些資訊位元用於在壓縮期間執行預處理作業時發出訊號。解碼器可使用這項資訊 例如,在顯示前決定值或者平滑漸層。

  • 0:不預先處理。
  • 1:縮減等級。

解碼器不必以任何特定方式使用這類資訊。

篩選方法 (F):2 位元

使用的篩選方法說明如下:

  • 0:無。
  • 1:橫向篩選器。
  • 2:垂直篩選器。
  • 3:漸層篩選器。

針對每個像素,系統會使用下列計算方式進行篩選。 假設目前 X 位置周圍的 Alpha 值標示如下:

 C | B |
---+---+
 A | X |

我們嘗試計算位於 X 的 Alpha 值。首先,預測結果 根據篩選方法產生:

  • 方法 0:預測器 = 0
  • 方法 1:Predictor = A
  • 方法 2:預測器 = B
  • 方法 3:預測者 = 剪輯(A + B - C)

其中 clip(v) 等於:

  • 如果 V < > 為 00、
  • 255 (如果 v 大於 255),或
  • v 否則為 v

將已解壓縮的值 X 新增至 預測器並使用模數 256 算術來包覆 [256..511] 的範圍 結合為 [0..255]

alpha = (predictor + X) % 256

最左和最上方的像素位置有特殊情況。適用對象 例如,位置 (0, 0) 的左上角值會使用 0 做為預測器值。 如果是其他情況:

  • 在水平或漸層篩選方法中,位於 位置 (0, y) 是用上述位置 (0、y-1) 進行預測。
  • 在垂直或漸層篩選方法中,最上方的像素 位置 (x, 0) 則是使用左側的位置 (x-1, 0) 進行預測。
壓縮方法 (C):2 位元

使用的壓縮方法:

  • 0:無壓縮。
  • 1:使用 WebP 無損格式壓縮。
Alpha 位元串流:Chunk Size 個位元組 - 1

已編碼的 Alpha 位元串流。

這個選用區塊包含此影格已編碼的 alpha 資料。包含 'VP8L' 區塊的框架不應包含此區塊。

原因:透明度資訊已是「VP8L」區塊的一部分。

當壓縮方法為「0」時,會以未壓縮的原始資料形式儲存 Alpha 通道資料;當壓縮方法為「1」時,則會以無損格式壓縮。

  • 原始資料:這個位元組序列包含長度為 = width * height 包含掃描順序中的所有 8 位元透明度值

  • 無損格式壓縮:位元組序列是隱含寬 x 高尺寸的壓縮圖片串流 (如「WebP 無損位元組串流格式」所述)。也就是說,這個圖片串流不含任何描述圖片尺寸的標頭。

    原因:維度已從其他來源得知 因此再次儲存這些資料,是多餘且容易出錯的。

    一旦圖片串流經過解碼,並轉換為 Alpha、紅、綠、藍 (ARGB) 顏色值,就必須按照無損格式規格所述的程序,從 ARGB 四元組的頻道中擷取透明度資訊。

    原因:綠色通道可在規格中使用額外的轉換步驟,這與其他通道不同,可改善壓縮效果。

位元串流 (VP8/VP8L)

這個區塊包含單一影格壓縮過的位元組串資料。

位元流區塊可以是 (i)「VP8」區塊,使用「VP8」(請注意第四個字元的空格) 做為 FourCC, (ii)「VP8L」區塊,使用「VP8L」做為 FourCC。

「VP8」的格式和「VP8L」分為多個章節 簡易檔案格式 (Lossy)簡易檔案格式 (遺失檔案) 等格式。

色彩設定檔

 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 個人資料。

這個區塊「必須」出現在圖像資料前。

這類區塊最多只能有一個。如果有更多這類區塊,讀者可以忽略第一個區塊以外的所有區塊。詳情請參閱 ICC 規格

如果沒有這個區塊,系統應假設為 sRGB。

中繼資料

中繼資料可以儲存在「EXIF」中或「XMP」塊狀。

每種類型 (「EXIF」和「XMP」) 最多應有一個區塊。如果有更多這類區塊,讀者可以忽略第一個區塊以外的所有區塊。

區塊的定義如下:

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 中繼資料:Chunk Size 個位元組
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 與本文件所述的任何區塊不同,就會視為不明區塊

原因:允許不明區塊可讓格式日後擴充,也能儲存任何應用程式專屬資料。

檔案可能包含不明的區塊:

讀者應忽略這些區塊。作者應將這些內容保存在 原始順序 (除非特別打算修改這些區塊)。

從框架組合無框畫

以下概略說明讀取器在動畫圖片的情況下,如何組合畫布。

這個程序會先使用 'VP8X' 區塊中指定的尺寸建立畫布,寬度為 Canvas Width Minus One + 1 像素,高度為 Canvas Height Minus One + 1 像素。「ANIM」中的 Loop Count 欄位區塊控制項如何 重複播放動畫程序這裡是以下項目的Loop Count - 1: 非零的Loop Count值或無限值,如果 Loop Count 為 0 則為無限。

在每次循環疊代開始時,畫布會使用 「ANIM」的背景顏色區塊或應用程式定義色彩。

「ANMF」區塊包含按顯示順序提供的個別影格。在算繪每個影格之前,系統會套用前一影格的 Disposal method

解碼影格的算繪作業會從笛卡兒座標 (2 * Frame X2 * Frame Y) 開始,並以畫布的左上角做為原點。Frame Width Minus One + 1 像素寬 x 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

檔案版面配置範例

採用 Alpha 值的有損編碼圖片可能如下所示:

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)