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 類型圖片/Webp
統一類型 IDorg.webmproject.webp

術語與基本概念

以下關鍵字「必須」、「不得」、「必要」、「應」、「不應」、「應該」、「不應該」、「建議」、「建議」、「MAY」和「選用」,在這份文件中全部在 BCP 19 中都顯示為大寫,而在 RFC 14 中都按照 BCP 14 顯示

WebP 檔案包含靜態圖片 (也就是像素編碼矩陣) 或動畫。您也可以選擇包含透明度資訊、色彩設定檔和中繼資料。我們將像素矩陣稱為圖片的畫布

RFC 1166 中所述,區塊圖中的位元編號從 0 開始,到最重要的位元 (MSB 0') 為止。

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

讀取者/寫入者
讀取 WebP 檔案的程式碼稱為「讀取工具」,而編寫這類檔案的程式碼則稱為「寫入者」
uint16
16 位元、小端子、無正負號整數。
uint24
24 位元、小端子、無正負號整數。
uint32
32 位元、小端子、無正負號整數。
FourCC
四字元代碼 (FourCC) 是一種 uint32,由以小到端的順序串連四個 ASCII 字元所建立。這表示系統會將「aaaa」(0x61616161) 和「AAAA」(0x41414141) 視為不同的 FourCCs
在 1 範圍內
儲存 -1 偏移值的無正負號整數欄位,例如,這個欄位會將值 25 儲存為 24
ChunkHeader('ABCD')
用於描述個別區塊的 FourCCChunk Size 標頭,其中「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 四字元代碼。
區塊大小: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 ' Chunk:

 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」的第四字元是 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 Lossless Bitstream 格式。請注意,VP8L 標頭包含 VP8L 圖片的寬度和高度。這假設是畫布的寬度和高度

擴充檔案格式

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

延伸格式檔案包含以下內容:

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

  • 包含色彩設定檔的選擇性「ICCP」區塊。

  • 選用的「ANIM」區塊,包含動畫控制資料。

  • 圖片資料。

  • 內含 Exif 中繼資料的選擇性「EXIF」Chunk。

  • 一個包含 XMP 中繼資料的選擇性「XMP」Chunk。

  • 不明區塊 (選用) 清單。

針對「靜態圖片」影像資料由單一影格組成,由下列項目組成:

對於動畫圖片圖片資料是由多個頁框組成。如要進一步瞭解影格,請參閱「動畫」一節。

重建及色彩校正所需的所有區塊 (即「VP8X」、「ICCP」、「ANIM」、「ANMF」、「ALPH」、「VP8」和「VP8L」) 都「必須」按照前述順序顯示。當重新建構和色彩校正錯誤所需的區塊順序錯誤時,讀取器「應該」會失敗。

「中繼資料」和「不明」區塊顯示的順序不正確。

理由:重建所需的區塊應先顯示在檔案中,讓讀取器在收到所有資料之前開始解碼圖片。配合實作方式調整中繼資料和自訂區塊的順序,對應用程式而言可能會有幫助。

擴充 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」區塊。
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)
畫布的預設背景顏色,單位為 [Blue、Green、Red、Alpha] 位元組順序。這個顏色可用於填滿影格周圍畫布上未使用的空間,以及第一個影格的透明像素。當處理方法為 1 時,也可以使用背景顏色。

注意

  • 即使未設定 'VP8X' Chunk 中的 Alpha 旗標,但背景顏色 MAY 仍會包含非不透明的 Alpha 值。

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

  • 系統會在每個迴圈開始時清除畫布。只要使用背景顏色,就能達成此目標。

循環計數:16 位元 (uint16)
動畫循環播放的次數。如果為 0,則代表無限。

如果已設定「VP8X」區塊中的動畫旗標,此區塊就「必須」出現。 如未設定動畫標記且有這個區塊,則必須忽略該區塊。

「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) 的解讀是由實作所定義。許多工具和瀏覽器會指派最短持續時間 (類似 GIF)。
保留:6 位元
必須為 0。讀者必須忽略這個欄位。
混合方法 (B):1 位元

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

  • 0:使用 Alpha 混合。處理上一個影格後,請使用 alpha 混合效果在畫布上轉譯目前的影格 (如下所示)。如果目前的影格沒有 Alpha 通道,請假設 Alpha 值為 255,有效取代矩形。

  • 1:不要混合。處理上一個影格後,請覆寫目前影格所涵蓋的矩形,在畫布上轉譯目前影格。

處理方法 (D):1 位元

指出在畫布顯示 (下一個影格之前) 顯示後,系統如何處理目前影格

  • 0:請勿丟棄。保持原樣。

  • 1:丟棄背景顏色。在畫布上由目前影格覆蓋的畫布上,使用 'ANIM' Chunk 中指定的背景顏色。

注意

  • 影格處理僅適用於影格矩形,也就是由「Frame X」、「Frame 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 混合時,必須考量圖片的色彩設定檔,以在線性色彩空間進行 Alpha 混合。如果沒有色彩設定檔,系統會假設標準 RGB (sRGB)。(請注意,由於 Gamma 約 2.2,因此 sRGB 也需要線性化)。

影格資料:Chunk Size - 16 個位元組

組成項目:

注意:「ANMF」酬載 Frame DataRIFF 檔案格式所述的個別「填充」區塊組成。

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:Predictor = B
  • 方法 3:Predictor = clip(A + B - C)

其中 clip(v) 等於:

  • 0 表示 < 0,
  • v > 255 時為 255,或
  • v 否則

最終值是將解壓縮值 X 新增至預測工具,並使用 modulo-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」區塊。

Alpha 管道資料會儲存為未壓縮的原始資料 (壓縮方法為「0」時),或使用無損格式 (壓縮方法為「1」) 的壓縮。

  • 原始資料:由長度為 = 寬度 * 高度的位元組順序組成,掃描順序包含所有 8 位元透明度值。

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

    原因:我們已透過其他來源得知這個維度,因此再次儲存這些維度可能會多餘且容易出錯。

    圖片串流解碼為 Alpha、紅、綠、藍 (ARGB) 色彩值後,必須按照無失格式規格所述的程序,從 ARGB 四元組的綠色管道擷取透明度資訊。

    理由:綠色通道在規格中允許額外的轉換步驟,但與其他管道不同,可改善壓縮率。

Bitstream (VP8/VP8L)

這個區塊含有單一影格的壓縮位元串流資料。

位元串流區塊可能是 (i)「VP8」的「Chunk」,使用「VP8」(請注意重要的第四字元空間) 做為 FourCC,「或」 (ii) 「VP8L」區塊,並使用「VP8L」做為 FourCC。

「VP8」和「VP8L」區塊的格式分別在簡易檔案格式 (Lossy)簡易檔案格式 (Lossless) 章節中說明。

色彩設定檔

 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                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
顏色設定檔:Chunk Size 位元組
ICC 設定檔。

這個區塊必須顯示在圖片資料之前。

最多只允許一個區塊。如果有多個這類區塊,讀者可能只會忽略除了第一個區塊。詳情請參閱 ICC 規格

如果沒有這個區塊,則應採用 sRGB。

Metadata

中繼資料可儲存在「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 中繼資料:Chunk Size 位元組
XMP 格式的圖片中繼資料。

請注意,「XMP」的第四字元是 ASCII 空格 (0x20)。

如需有關處理中繼資料的其他指引,請參閱中繼資料工作小組的「處理中繼資料指南」

未知區塊

針對 FourCC 與本文件所述的任何區塊不同的 RIFF 區塊 (如「RIFF 檔案格式」一節所述),則視為「不明區塊」

理由:允許不明區塊可提供日後擴充格式的佈建,同時也允許儲存任何應用程式特定資料。

檔案「可能」含有未知的區塊:

讀者應忽略這些區塊。寫入者「必須」以原始順序保留這些區塊 (除非他們特別打算修改這些區塊)。

外框的無框畫組裝

以下將概略說明讀者在製作動畫圖片的情況下,「必須」組裝畫布的方式。

該程序會先使用「VP8X」Chunk 中提供的尺寸 (寬 Canvas Width Minus One + 1 像素 x Canvas Height Minus One + 1 像素) 建立畫布。「ANIM」區塊中的 Loop Count 欄位可控制重複播放動畫程序的次數。對於非零 Loop Count 值,此為 Loop Count - 1;如果 Loop Count 為零,則為無限值。

在每個迴圈疊代一開始,畫布都會使用「ANIM」區塊的背景顏色或應用程式定義的顏色填滿畫布。

「ANMF」區塊包含按照顯示順序排列的個別影格。在轉譯每個影格之前,系統會套用上一個影格的 Disposal method

解碼影格的轉譯作業是從笛卡兒座標 (2 * Frame X2 * Frame Y) 開始,並使用畫布左上角做為起點。使用 Blending method 轉譯在畫布上,寬度為 Frame Width Minus One + 1 x Frame Height Minus One + 1 像素的高度。

畫布的顯示時間為 Frame Duration 毫秒。這種做法會一直持續下去,直到系統顯示「ANMF」區塊發出的所有影格。系統會開始新的循環疊代作業,或完成所有疊代後,畫布會維持在最終狀態。

下列虛擬程式碼說明轉譯程序。VP8X.field 標記法則代表「VP8X」Cunk 中具有相同說明的欄位。

VP8X.flags.hasAnimation MUST be TRUE
canvas ← new image of size VP8X.canvasWidth x VP8X.canvasHeight with
         background color ANIM.background_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
    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)