簡介
WebP 是一種圖片格式,採用 (i) VP8 主要影格編碼, 以失真的方式壓縮圖片資料,或 (ii) WebP 無損編碼。這些 編碼配置應該會比舊格式 (如 JPEG) 更有效率 GIF 和 PNG 格式最適合透過網路快速傳輸圖片 ( 例如網站)。WebP 格式的功能一致 (色彩設定檔、 中繼資料、動畫等)。本文件說明 WebP 檔案的結構
WebP 容器 (即 WebP 的 RIFF 容器) 允許功能支援 可能大幅提高 WebP 基本用法 (也就是含有 編碼為 VP8 主要影格的圖片)。WebP 容器提供了額外的 支援下列項目:
無損壓縮: 使用 WebP 無損格式。
中繼資料:圖片可能含有儲存在可交換影像檔案中的中繼資料 格式 (Exif) 或可擴充中繼資料平台 (XMP) 格式。
不透明:圖片可能包含透明度,也就是 Alpha 管道。
色彩設定檔:圖片可嵌入 ICC 設定檔,如所述 國際色彩聯盟 (International Color Consortium) 敬上
動畫:圖片可能含有多個影格之間出現暫停點 製作成動畫
命名
建議在提及 WebP 時使用以下類型 容器:
容器格式名稱 | WebP |
副檔名 | .webp |
MIME 類型 | image/webp |
統一類型 ID | org.webmproject.webp |
術語與基本設定
下列關鍵字:「必須」、「不得」、「必要」、「應」、「不應」、「應該」、「應該」、 「不應該」、「建議」、「不建議」、「可能」和「選用」在此流程的各個階段 文件被解讀為 BCP 14 RFC 2119 RFC 8174 中所述 而且只有在出現大小寫之分時,才會顯示為大寫,如此處所示。
WebP 檔案包含靜態圖片 (也就是像素的編碼矩陣) 或動畫。或者也可以提供透明度 資訊、色彩設定檔和中繼資料。我們將像素矩陣稱為 圖片的畫布。
區塊圖中的位元編號從 0
開始,以最低的精度顯示
(「MSB 0」),如 RFC 1166 中所述。
以下是本文件中使用的附加條款:
- 讀取者/寫入者
- 讀取 WebP 檔案的程式碼稱為「讀取器」,而程式碼會 寫入的節點稱為「寫入者」。
- uint16
- 16 位元的小端序整數。
- uint24
- 24 位元的小端序整數。
- uint32
- 32 位元的小端序整數。
- FourCC
- 四字元代碼 (FourCC) 是串聯四個字元組成的 uint32 ASCII 字元。意思是「aaaa」(0x61616161) 和 「AAAA」(0x41414141) 將視為不同的 FourCCs。
- 1 家公司
- 儲存值會偏移
-1
的無正負號整數欄位,例如 欄位會將值「25」儲存為 24。 - ChunkHeader('ABCD')
- 用於描述個別區塊的 FourCC 和 Chunk 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 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Chunk FourCC:32 位元
- 用於區塊識別的 ASCII 四字元碼。
- 區塊大小:32 位元 (uint32)
- 區塊大小 (以位元組為單位,不含這個欄位,即區塊) ID 或邊框間距
- 區塊酬載:Chunk Size 個位元組
- 資料酬載。如果「Chunk Size」為奇數,則為單一填充位元組 (務必採用)
為符合 RIFF 的規範,系統會新增
0
。
注意:RIFF 的慣例是全部大寫的 FourCCs 都是標準格式 適用於所有 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」。檔案大小
標頭中共計包含 4
個位元組的區塊大小
「WEBP」FourCC。檔案「不可」包含資料後的任何資料
檔案大小。讀者可以剖析這類檔案,並忽略結尾
資料。如同任何區塊的大小,RIFF 標頭提供的大小是
甚至還能以下說明個別區塊的內容
專區。
簡易檔案格式 (Lossy)
如果圖片需要失真編碼,且不需要 需要透明效果或其他由擴充格式提供的進階功能 這種版面配置的檔案較小,且受到舊版軟體支援。
簡易 WebP (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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| 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,建議使用 Recommendation 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 無損 Bitstream 格式。請注意,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 設定檔 (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
。 - Canvas 高度減一:24 位元
- 以像素為單位的 1 型高度。
實際畫布高度為
1 + Canvas Height Minus One
。
Canvas Width 和 Canvas Height 的產品不得超過 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
。 - Frame 寬度減一: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 值為 255,有效取代矩形。1
:請勿混合。處理上一個影格後,請算繪 方法是覆寫 目前的畫面。
- 處理方法 (D):1 位元
表示在經過目前的影格後,系統如何處理目前的影格 是否顯示在畫布上 (在轉譯下一個影格之前):
0
:請勿丟棄。將畫布維持原樣。1
:丟棄背景顏色。填滿畫布的矩形 包含在目前頁框中,所指定的背景顏色為 ANIM'區塊。
注意事項:
影格處理動作僅適用於「頁框矩形」,也就是 由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 混合 圖片的顏色設定檔。如果顏色設定檔是 ,則假設使用的是標準 RGB (sRGB)。(請注意,sRGB 也包含 由於 Gamma 約 2.2,因此需要線性化)。
注意:「ANMF」酬載,Frame Data 是由 填充區塊,如 RIFF 檔案格式所述。
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、
- 如果 V > 為 255255 或
- 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 Bitstream:區塊大小 -
1
個位元組 經過編碼的 Alpha 位元串流。
這個選用區塊含有這個影格的已編碼 Alpha 資料。影格 包含「VP8L」區塊「不應」包含這個區塊。
理由:資訊公開資訊已是「VP8L」的一部分。 區塊。
Alpha 管道資料會儲存為未壓縮的原始資料 (當 是「0」) 或以無損格式壓縮 (當壓縮方法為「1」時)。
原始資料:這個位元組序列包含長度為 = width * height 包含掃描順序中的所有 8 位元透明度值
無損格式壓縮:位元組序列為壓縮後的內容 圖片串流 (如 WebP Lossless Bitstream 格式 中所述) 的隱含尺寸 x 高。也就是說 圖片串流「不會」包含任何說明圖片尺寸的標頭。
原因:維度已從其他來源得知 因此再次儲存這些資料,是多餘且容易出錯的。
圖像串流解碼為 Alpha、紅色、綠色、藍色 (ARGB) 的顏色後 值,並按照無損格式 就必須從 ARGB 四捨五入的 green 通道。
理由:綠色通道有助於推動額外轉型 與其他管道不同, 來改善壓縮品質
Bitstream (VP8/VP8L)
這個區塊包含單一影格的壓縮位元流資料。
位元區塊可以是 (i)「VP8」Chunk,使用「VP8」(請注意, 重要四字元空間) 做為 FourCC,或 (ii)「VP8L」塊 使用「VP8L」。
「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 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 色彩剖析:Chunk Size 位元組
- 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 與本文件描述的任何區塊不同 視為不明區塊
理由:允許不明區塊可為未來擴充功能提供佈建。 格式也可用來儲存任何應用程式特定資料。
一個檔案可能包含未知區塊:
- ,如 Extended WebP 檔案所述 title 區段,或
- 「ANMF」結尾區塊,如 「Animation」部分。
讀者應忽略這些區塊。作者應將這些內容保存在 原始順序 (除非特別打算修改這些區塊)。
框架中的畫布組裝
以下概略說明讀者必須如何組裝畫布 動畫圖片
此程序一開始是先使用
「VP8X」區塊,高度 Canvas Width Minus One + 1
x Canvas Height Minus
One + 1
像素。「ANIM」中的 Loop Count
欄位區塊控制項如何
重複播放動畫程序這裡是以下項目的Loop Count - 1
:
非零的Loop Count
值或無限值,如果 Loop Count
為 0 則為無限。
在每次循環疊代開始時,畫布會使用 「ANIM」的背景顏色區塊或應用程式定義色彩。
「ANMF」區塊包含按顯示順序提供的個別影格。算繪前
每個影格都會套用前一個影格的 Disposal method
。
已解碼影格的算繪作業會從笛卡兒座標 (2 *
Frame X
、2 * 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)