WebP Container の仕様

はじめに

WebP は、(i)VP8 キー フレーム エンコードを使用して画像データを非可逆的に圧縮するか、(ii)WebP 可逆エンコードを使用する画像形式です。これらのエンコード スキームにより、JPEG、GIF、PNG などの古い形式よりも効率的になります。ネットワークを介した高速画像転送( (たとえばウェブサイトなど)。WebP 形式は、他の形式と同じ機能(カラープロファイル、メタデータ、アニメーションなど)を備えています。このドキュメントでは、WebP ファイルの構造について説明します。

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

  • 可逆圧縮: WebP Lossless Format

  • メタデータ: 画像のメタデータが交換可能な画像ファイルに保存されていることがある Format(Exif)形式または Extensible Metadata Platform(XMP)形式

  • 透明度: 画像に透明度(アルファ チャンネル)が設定されている場合があります。

  • カラー プロファイル: 画像には、International Color Consortium で説明されている ICC プロファイルが埋め込まれている場合があります。

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

命名

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

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

用語と基本

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

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

チャンク図のビット番号は、RFC 1166 で説明されているように、最上位ビット(MSB 0)の 0 から始まります。

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

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

: 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 ファイルは、FourCC の「WEBP」を含む RIFF ヘッダーで始まります。ヘッダーのファイルサイズは、続くチャンクの合計サイズに「WEBP」FourCC の 4 バイトを加えたものです。ファイルには、ファイルサイズで指定されたデータの後にデータが含まれていてはなりません。リーダーは、末尾のものを無視して、そのようなファイルを解析しても構いません。 分析できますチャンクのサイズは偶数であるため、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 データ: チャンクサイズ(バイト)
VP8 ビットストリーム データ。

「VP8」FourCC の 4 番目の文字は 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 データ: チャンクサイズ(バイト)
VP8L ビットストリーム データ。

VP8L ビットストリームの現在の仕様については、WebP ロスレス ビットストリーム形式をご覧ください。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」チャンク。

'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
キャンバスのデフォルトの背景色(青、緑、赤、アルファのバイトの順序)。この色は、フレーム周辺のキャンバス上の未使用のスペースや、最初のフレームの透明なピクセルを塗りつぶすために使用できます。背景色は、廃棄方法が 1 の場合にも使用されます。

:

  • 'VP8X' チャンク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 です。
フレーム幅 - 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 にする必要があります。読者はこのフィールドを無視する必要があります。
ブレンド方法(B): 1 ビット

現在のフレームの透明なピクセルを、前のキャンバスの対応するピクセルとどのようにブレンドするかを示します。

  • 0: アルファ ブレンドを使用します。前のフレームを破棄した後、 キャンバス上にある現在のフレームをアルファ ブレンディング(以下を参照)で描画します。現在のフレームにアルファ チャンネルがない場合は、アルファ値が 255 であると想定し、長方形を効果的に置き換えます。

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

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

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

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

  • 1: 背景色に破棄します。現在のフレームで覆われているキャンバス上の長方形を、「ANIM」チャンクで指定された背景色で塗りつぶします。

:

  • フレームの廃棄は、フレームの長方形、つまり フレーム 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: 予測器 = 0
  • メソッド 1: predictor = A
  • メソッド 2: 予測子 = B
  • メソッド 3: 予測子 = clip(A + B - C)

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

  • v < の場合、00、
  • v > の場合 255255
  • 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 ロスレス形式で圧縮されています。
アルファ ビットストリーム: チャンクサイズ バイト - 1

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

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

理由: 透明性情報はすでに「VP8L」チャンクの一部になっています。

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

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

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

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

    画像ストリームがアルファ、赤、緑、青(ARGB)の色値にデコードされたら、ロスレス形式仕様で説明されているプロセスに沿って、ARGB 四重体のチャンネルから透明度情報を抽出する必要があります。

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

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

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

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

「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 メタデータ: チャンクサイズ(バイト)
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 の 4 番目の文字は ASCII スペース(0x20)です。

メタデータの処理に関するその他のガイダンスについては、メタデータ ワーキング グループの「メタデータの処理に関するガイドライン」をご覧ください。

不明なチャンク

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

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

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

リーダーはこれらのチャンクを無視すべきです。書き込み側は、これらのチャンクを元の順序で保持する必要があります(これらのチャンクを変更する明確な意図がない限り)。

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

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

このプロセスは、VP8X チャンクで指定されたサイズ(幅 Canvas Width Minus One + 1 ピクセル、高さ Canvas Height Minus One + 1 ピクセル)を使用してキャンバスを作成することから始まります。「ANIM」の Loop Count フィールドチャンクは、 アニメーション処理が何度も繰り返されますこれは、Loop Count 値がゼロでない場合の Loop Count - 1 または、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)