PicScrub logoPicScrub
対応形式に戻る

WebP 形式

Google の新しい画像フォーマット

RIFF コンテナ

Google は WebP のために新しいコンテナを作りませんでした。選んだのは RIFF、90 年代初頭から WAV の音声や AVI の動画を運んできたあの形式です。 WAV ファイルを解析したことがあるなら、コンテナのレベルでは WebP も 同じだと分かるはずです。

この形式では、4 文字の識別子(FourCC コードと呼ばれます)を持つチャンクを 入れ子にして使います。シンプルで頑丈な、時の試練に耐えた設計です。

WebP のファイル構造(RIFF コンテナ)

RIFF
Size
WEBP
VP8X
EXIF/XMP
VP8/VP8L
RIFF
4 バイト
コンテナのシグネチャ
Size
4 バイト
ファイルサイズ - 8
WEBP
4 バイト
形式の識別子
VP8X
18 バイト
拡張機能のフラグ
EXIF/XMP
100 バイト
メタデータのチャンク
VP8/VP8L
可変長
画像データ

WebP のヘッダー

RIFF のシグネチャ
ファイルサイズ - 8
WEBP 識別子
VP8X のチャンク種別
VP8X のサイズ(10)
VP8X のフラグ
キャンバスサイズ
OffsetHexASCII
0000
52494646241A00005745425056503858
RIFF$...WEBPVP8X
0010
0A00000010000000FF0000FF00000000
..............

RIFF チャンクの構造

FourCCSizeData
4 バイト4 バイト (LE)可変

補足: チャンクのデータは、必要に応じてヌルバイトで偶数長に そろえられます。

主なオフセット

  • • サブチャンクの開始位置: 12 バイト(RIFF + size + WEBP のあと)
  • • チャンクヘッダー: 8 バイト(4 バイトの FourCC + 4 バイトのサイズ)
  • • サイズフィールドの位置: チャンク先頭から +4(リトルエンディアン)

画像のチャンク

WebP は実のところ 3 つの形式がひとつになったものです。非可逆(VP8)、 可逆(VP8L)、拡張(VP8X)。どの圧縮方式が使われたかは、 チャンクの種類で分かります。

VP8:非可逆圧縮

圧縮に VP8 の動画コーデックを使います。画質とサイズの比率は JPEG と同じくらいです。シンプルな WebP はこのチャンクだけを持ちます。

VP8L:可逆圧縮

予測、色変換、エントロピー符号化を使う可逆圧縮です。 ふつう PNG より 25〜34% 小さくなります。

VP8X:拡張形式

アニメーション、アルファチャンネル、ICC プロファイル、EXIF、XMP といった任意機能があることを示します。これらのいずれかを使うときは 必須です。

ALPH:アルファチャンネル

独立したアルファチャンネルのデータ。色データとは別に、 可逆でも非可逆でも圧縮できます。

ANIM/ANMF:アニメーション

ANIM にはアニメーション全体のパラメータが入ります。ANMF チャンクは 各フレームとそのタイミング情報を持ちます。

メタデータのチャンク

画像データしか持たないシンプルな WebP と違い、拡張形式の WebP は メタデータを運べます。ありがたいのは、これらのチャンクが画像データと きれいに分かれているため、見つけて取り除くのが簡単なことです。

EXIF:EXIF のメタデータ

JPEG と同じ形式(生の TIFF 構造)で EXIF データが入っています。 カメラ情報、GPS の座標、日時、サムネイルが含まれます。 プライバシー上いちばん注意すべき部分です。

XMP:XMP のメタデータ

XML ベースのメタデータ。EXIF と重複する内容に加えて、編集履歴、 ソフトの情報、独自の項目が入ることもあります。

ICCP:ICC カラープロファイル

カラーマネジメント用の ICC プロファイル。PicScrub は色を正確に 保つため、初期設定では残します。

VP8X のフラグ

VP8X チャンクは目次のような役割を持ち、ファイルに何が入っているかを デコーダに伝えます。メタデータのチャンクを削除したときは、このフラグも 合わせて更新しなければなりません。そうしないと、デコーダが存在しない データを探しにいってしまいます。

フラグのビット

Bit 0予約(0 でなければなりません)
Bit 1アニメーションのフラグ
Bit 2XMP メタデータあり
Bit 3EXIF メタデータあり
Bit 4アルファチャンネルあり
Bit 5ICC プロファイルあり

フラグが大事な理由

PicScrub は EXIF/XMP のチャンクを削除したら、それに合わせて VP8X の フラグも更新します。そうしないと、デコーダが存在しないデータを 期待してしまうことがあります。

PicScrub が WebP を処理する流れ

1

RIFF ヘッダーの検証

RIFF....WEBP のシグネチャを確かめます

2

チャンクの解析

すべての RIFF チャンクをたどり、FourCC とサイズを読みます

3

メタデータのチャンクを削除

書き出すときに EXIF と XMP のチャンクを飛ばします

4

VP8X のフラグを更新

VP8X チャンクの EXIF/XMP のフラグビットをクリアします

5

ファイルサイズの再計算

新しい総ファイルサイズで RIFF ヘッダーを書き換えます

残るもの

  • • VP8/VP8L の画像データ
  • • ALPH のアルファチャンネル
  • • ANIM/ANMF のアニメーションデータ
  • • ICCP のカラープロファイル(任意)

削除されるもの

  • • EXIF のメタデータ
  • • XMP のメタデータ

シンプルな WebP と拡張形式の WebP

WebP ファイルに VP8X チャンクがなければ、それは「シンプルな」WebP です。 RIFF のラッパーがひとつの VP8 または VP8L チャンクを包んでいるだけの 構造です。シンプルな WebP にはメタデータを入れる余地がないので、 プライバシーを気にするなら理想的な形といえます。

シンプルな WebP

VP8 または VP8L チャンクだけ。メタデータは入りません。

RIFF + WEBP + VP8/VP8L

拡張形式の WebP

VP8X チャンクがあり、メタデータ、アルファ、アニメーションを使えます。

RIFF + WEBP + VP8X + [ICCP] + [ANIM] + [EXIF] + [XMP] + VP8/VP8L