WebP Container の仕様

はじめに

WebP は、(i)VP8 キーフレーム エンコーディングを使用して、 画像データを非可逆圧縮方式で圧縮するか、(ii)WebP 可逆圧縮方式で圧縮します。これらの 古い形式(例: JPEG、 GIF、PNG などですネットワークを介した高速画像転送( (たとえばウェブサイトなど)。WebP 形式には同等の機能(カラー プロファイル、 メタデータ、アニメーションなど)を、他の形式と置き換える場合です。このドキュメントでは、 構造を定義します。

WebP コンテナ(WebP の RIFF コンテナ)では機能のサポートが可能 WebP の基本的なユースケース(1 つのファイルを含むファイル)よりも (例: VP8 キーフレームとしてエンコードされた画像)です。WebP コンテナは、追加の 以下をサポートしています。

  • 可逆圧縮: WebP Lossless Format

  • メタデータ: 画像のメタデータが交換可能な画像ファイルに保存されていることがある 形式(Exif)または拡張メタデータ プラットフォーム(XMP)のいずれか。

  • 透明度: 画像には透明度(アルファ チャンネル)がある場合があります。

  • カラー プロファイル: 画像には、 International Color Consortium によって開発されました。

  • アニメーション: 1 つの画像は、間に一時停止する複数のフレームを持つ場合があります。 アニメーションにします。

命名

WebP を参照するときは、以下のタイプを使用することが推奨されます。 container:

コンテナ形式名WebP
ファイル名の拡張子.webp
MIME タイプimage/webp
ユニフォーム タイプの識別子org.webmproject.webp

用語と基本

キーワードは、「しなければならない」、「してはならない」、「必須である」、「すべきである」、「すべきである」、「すべきである」、「すべきである」、 「すべきでないこと」、「推奨する」、「非推奨」、「しても構いません」、「任意」 BCP 14 RFC 2119 RFC 8174 に記載されているとおりに解釈されます。 これらはすべて大文字で記述します。

WebP ファイルには、静止画像(エンコードされたピクセル マトリックス)か アニメーションを使用できます。必要に応じて透明度を含める カラー プロファイル、メタデータなどです。ピクセルの行列は 画像のキャンバス

チャンク図のビット番号は、最上位ビットが 0 から始まります。 (MSB 0)です(RFC 1166 を参照)。

このドキュメント全体で使用されるその他の用語は次のとおりです。

リーダー/ライター
WebP ファイルを読み取るコードは「リーダー」と呼ばれますが、 書き込みはライターと呼ばれます。
uint16
16 ビット、リトル エンディアン、符号なし整数。
uint24
24 ビット、リトル エンディアン、符号なし整数。
uint32
32 ビット、リトル エンディアン、符号なし整数。
FourCC
4 文字のコード(FourCC)は、4 つの文字列を連結して作成される uint32 リトル エンディアン順の ASCII 文字。「aaaa」という意味です。(0x61616161)および 「AAAA」(0x41414141)は異なる FourCCs として扱われます。
1 ベース
-1 でオフセットされた値を格納する符号なし整数フィールド。たとえば、 フィールドには値 2524 として格納されます。
ChunkHeader('ABCD')
個々のチャンクの FourCC ヘッダーと Chunk 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
チャンクのサイズ(バイト単位)。これには、このフィールドとチャンクは含まれません。 パディングがあります
チャンク ペイロード: Chunk Size バイト
データ ペイロード。[Chunk Size] が奇数の場合、1 バイトのパディング バイト(必須) RIFF に準拠するために 0 であること -- が追加されます。

注: RIFF には、すべて大文字のチャンク 4CC を標準とする規則があります。 任意の RIFF ファイル形式に適用されるチャンクと、ファイルに固有の 4 つのチャンク すべて小文字にします。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 ファイルは、FourCC の「WEBP」を含む RIFF ヘッダーで始まります。ファイルサイズ 以降のチャンクの合計サイズに 4 バイトを 「WEBP」4 CC です。ファイルのデータの File Size で指定されます。リーダーは、末尾のものを無視して、そのようなファイルを解析しても構いません。 分析できますチャンクのサイズは偶数であるため、RIFF ヘッダーによって指定されるサイズは 調整できます。個々のチャンクの内容については、以下で説明します。 できます。

シンプルなファイル形式(不整合)

このレイアウトは、画像に非可逆エンコードが必要で、エンコードが不要な場合に使用するべきです。 透明性など、拡張フォーマットで提供される高度な機能が必要になる。 このレイアウトのファイルはサイズが小さく、古いソフトウェアでサポートされています。

シンプルな 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」の 4 番目の文字はFourCC は ASCII スペース(0x20)です。

VP8 ビットストリーム形式の仕様については、VP8 Data Format and デコード ガイドをご覧ください。なお、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 Lossless ビットストリーム形式。注: VP8L ヘッダーは このオブジェクトには VP8L イメージの幅と高さが格納されています。この値は 0,000,000 キャンバスの高さを指定します

拡張ファイル形式

注: 古いリーダーは拡張形式のファイルに対応していない場合があります。

拡張形式のファイルは次の要素で構成されます。

  • 「VP8X」ファイルで使用されている機能に関する情報を含むチャンク。

  • オプションの「ICCP」カラー プロファイルを持つチャンク。

  • オプションの「ANIM」アニメーション制御データを含むチャンク。

  • 画像データ。

  • オプションの「EXIF」Exif メタデータを含むチャンク。

  • オプションの「XMP」XMP メタデータを含むチャンク。

  • 不明なチャンクのリスト(省略可)。

静止画像の場合、画像データは単一のフレームで構成されます。このフレームは、 ~:

アニメーション画像の場合、画像データは複数のフレームで構成されます。さらに表示 フレームについて詳しくは、アニメーションのセクションをご覧ください。

再構成と色補正に必要なすべてのチャンク、「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」が含まれているかどうかを設定しますチャンク。
アルファ(L): 1 ビット
画像のフレームのいずれかに透明度情報を含めるかどうかを設定します (「アルファ版」)。
EXIF メタデータ(E): 1 ビット
ファイルに Exif メタデータが含まれているかどうかを設定します。
XMP メタデータ(X): 1 ビット
ファイルに XMP メタデータが含まれているかどうかを設定します。
アニメーション(A): 1 ビット
アニメーション画像であるかどうかを設定します。「ANIM」のデータおよび「ANMF」チャンクは 使用されます。
予約済み(R): 1 ビット
0 でなければなりません。リーダーはこのフィールドを無視しなければなりません。
予約済み: 24 ビット
0 でなければなりません。リーダーはこのフィールドを無視しなければなりません。
キャンバス幅 - 1: 24 ビット
1 を基準とするキャンバスの幅(ピクセル単位)。 実際のキャンバスの幅は 1 + Canvas Width Minus One です。
キャンバスの高さ - 1: 24 ビット
1 を基準としたキャンバスの高さ(ピクセル単位)。 実際のキャンバスの高さは 1 + Canvas Height Minus One です。

キャンバスの幅キャンバスの高さの積は、2^32 - 1 以下にする必要があります。

今後の仕様でフィールドが追加される可能性があります。不明なフィールドは無視しなければなりません。

アニメーション

アニメーションは「ANIM」によって制御されていますおよび「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('ANIM')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Background Color                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Loop Count           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
背景色: 32 ビット(uint32
キャンバスのデフォルトの背景色(青、緑、赤、アルファ) あります。この色は、キャンバスの未使用のスペースを塗りつぶすために使用しても構いません。 最初のフレームの透明なピクセルを指定します 背景色は、Disposal メソッドが 1 の場合も使用されます。

:

  • 背景の色が不透明なアルファ値であっても、含んでも構いません。 「VP8X」の alpha フラグチャンクが設定されていない。

  • 閲覧者アプリは、背景色の値をヒントとして扱うべきです。また、 使用する必要はありません。

  • キャンバスは各ループの開始時にクリアされます。背景色は行っても構いません 見ていきましょう。

ループ数: 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 です。
フレーム幅 - 1: 24 ビット(uint24
フレームの 1 を基準とする幅。 フレームの幅は 1 + Frame Width Minus One です。
フレーム高さ - 1: 24 ビット(uint24
フレームの 1 を基準とした高さ。 フレームの高さは 1 + Frame Height Minus One です。
フレーム継続時間: 24 ビット(uint24
次のフレームを表示するまでの待機時間(1 ミリ秒単位)。 Frame Duration の 0(通常 <= 10)の解釈は、 実装によって定義されます。多くのツールやブラウザでは、最小権限の原則が GIF のような長さです。
予約済み:6 ビット
0 でなければなりません。リーダーはこのフィールドを無視しなければなりません。
ブレンド方法(B): 1 ビット

現在のフレームの透明ピクセルをブレンドする方法を指定します を、対応するピクセルに置き換えます。

  • 0: アルファ ブレンドを使用します。前のフレームを破棄した後、 キャンバス上にある現在のフレームをアルファ ブレンディング(以下を参照)で描画します。もし 現在のフレームにはアルファ チャンネルがありません。アルファ値が 255 を返し、実質的に長方形を置き換えます。

  • 1: 統合しない。前のフレームを破棄した後、 キャンバスで覆われている長方形を上書きして、現在のフレームを 選択します。

廃棄方法(D): 1 ビット

現在のフレームが処理された後にどのように処理されるかを示します。 次のフレームをレンダリングする前に表示されます。

  • 0: 廃棄しないでください。キャンバスはそのままにします。

  • 1: 背景色に廃棄します。キャンバス上の長方形を塗りつぶします 現在のフレームで覆われている部分を、 「アニメーション」チャンク

:

  • フレームの廃棄は、フレームの長方形、つまり フレーム 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
    
  • アルファ ブレンドは、以下を考慮して線形色空間で行う必要があります。 画像のカラー プロファイル。カラー プロファイルが 存在しない場合は、標準 RGB(sRGB)が想定されます。(sRGB も ガンマが約 2.2 になるため、線形化する必要があります)。

フレームデータ: チャンクサイズ - 16 バイト

構成内容:

: 「ANMF」ペイロード(フレーム データ)は、個々の要素で パディング チャンク。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 でなければなりません。リーダーはこのフィールドを無視しなければなりません。
前処理(P): 2 ビット

これらの情報ビットは、事前処理が実行されたことを通知するために使用されます。 行われます。デコーダはこの情報を使用して、 たとえば、表示前に値をディザリングしたり、グラデーションを滑らかにしたりできます。

  • 0: 前処理なし。
  • 1: レベルダウン。

デコーダは、この情報を特定の方法で使用する必要はありません。

フィルタリング方法(F): 2 ビット

使用されるフィルタリング メソッドは次のとおりです。

  • 0: なし。
  • 1: 水平フィルタ。
  • 2: 垂直フィルタ。
  • 3: グラデーション フィルタ。

各ピクセルに対して、以下の計算を使用してフィルタリングが実行されます。 現在の X の位置を囲むアルファ値は次のようにラベル付けされているとします。

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

位置 X のアルファ値の計算を試みます。まず、予測は フィルタ方法によって異なります。

  • メソッド 0: predictedor = 0
  • メソッド 1: predictedor = A
  • メソッド 2: 予測器 = B
  • メソッド 3: predictedor = clip(A + B - C)

ここで、clip(v) は以下と等しくなります。

  • v < の場合、00、
  • v > の場合 255255
  • それ以外の場合は

最終的な値は、解凍した値 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 ロスレス形式で圧縮されます。
アルファ ビットストリーム: チャンクサイズ - 1 バイト

エンコードされたアルファ ビットストリーム。

このオプションのチャンクには、このフレームのエンコードされたアルファデータが含まれます。フレーム 「VP8L」を含むチャンクにこのチャンクが含まれるべきではありません。

説明: 透明性情報はすでに「VP8L」に含まれています。 チャンク。

アルファ チャンネル データは、圧縮されていない元データとして保存されます( 「0」か、可逆形式で圧縮される) (圧縮方法が「1」の場合)。

  • 元データ: 長さ = 幅 × 高さのバイト シーケンスで構成されます。 スキャン順にすべての 8 ビットの透過性値を含む。

  • 可逆形式圧縮: バイト シーケンスは圧縮 幅 x 高さが暗黙的に指定された画像ストリーム(WebP ロスレス ビットストリーム形式に記載)つまり、 image-stream には、画像のサイズを説明するヘッダーが含まれていません。

    根拠: ディメンションが他のソースからすでにわかっている。 もう一度保存すると冗長になり エラーが発生しやすくなります

    イメージ ストリームがアルファ、赤、緑、青(ARGB)色にデコードされると (可逆形式で記述されたプロセスに従って、 出力する必要がある場合は、その情報を ARGB クワッドレットのチャネル。

    説明: Green チャネルには追加の変換が許可されています。 仕様のステップには、他のチャネルとは異なり、 圧縮率が向上します。

ビットストリーム(VP8/VP8L)

このチャンクには、単一フレームの圧縮ビットストリーム データが含まれます。

ビットストリームチャンクは、(i)「VP8」のいずれかです。チャンク(「VP8」を使用)( (重要な 4 文字スペース)を FourCC として使用する、または(ii)「VP8L」チャンク 「VP8L」を使用FourCC として指定します。

「VP8」の形式は、「VP8L」チャンクについては、このモジュールの シンプルなファイル形式(Lossy) Simple File Format (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 プロファイル。

このチャンクは画像データの前に表示しなければなりません。

このようなチャンクは最大で 1 つ存在すべきです。そのようなチャンクが多い場合 最初のもの以外をすべて無視しても構いません。 詳しくは、ICC 仕様をご覧ください。

このチャンクが存在しない場合、sRGB を想定すべきです。

メタデータ

メタデータは「EXIF」に格納できるまたは「XMP」チャンク。

各タイプ(EXIF と XMP)のチャンクを 1 つだけ含めるべきです。もし そのようなチャンクが多い場合、読者は最初のもの以外をすべて無視しても構いません。

チャンクは次のように定義されます。

「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」の 4 番目の文字はFourCC は ASCII スペース(0x20)です。

メタデータの処理に関するその他のガイダンスについては、 Metadata Working Group の「Guidelines for Handling Metadata

不明なチャンク

RIFF チャンク(RIFF ファイル形式のセクションで説明) その FourCC がこのドキュメントで説明しているチャンクのいずれとも異なる場合、 未知のチャンクとみなされます。

根拠: 不明なチャンクを許可することで、将来の拡張に備える また、アプリケーション固有のデータを保存することもできます。

ファイルには、不明なチャンクが含まれても構いません。

リーダーはこれらのチャンクを無視すべきです。ライターは、それらを (ただし、チャンクの変更が特に意図されている場合を除く)。

フレームからのキャンバス アセンブリ

ここでは、リーダーがケースにキャンバスを組み立てる方法の概要を説明します。 作成します。

このプロセスは、最初に 「VP8X」幅 Canvas Width Minus One + 1 ピクセル、高さ Canvas Height Minus One + 1 ピクセルのチャンク。「ANIM」の Loop Count フィールドチャンクは、 アニメーション処理が何度も繰り返されます次の地域では Loop Count - 1 です: ゼロ以外の Loop Count 値、または Loop Count がゼロの場合は無限大。

各ループの反復処理の開始時に、キャンバスは 「ANIM」から抽出したチャンクまたはアプリケーション定義の色。

「ANMF」チャンクには、表示順序で指定された個々のフレームが含まれます。レンダリング前 前のフレームの Disposal method が適用されます。

デコードされたフレームのレンダリングは、キャンバスの左上隅を原点として使用し、デカルト座標(2 * Frame X2 * 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)