WebP 形式
Google の新しい画像フォーマット
RIFF コンテナ
Google は WebP のために新しいコンテナを作りませんでした。選んだのは RIFF、90 年代初頭から WAV の音声や AVI の動画を運んできたあの形式です。 WAV ファイルを解析したことがあるなら、コンテナのレベルでは WebP も 同じだと分かるはずです。
この形式では、4 文字の識別子(FourCC コードと呼ばれます)を持つチャンクを 入れ子にして使います。シンプルで頑丈な、時の試練に耐えた設計です。
WebP のファイル構造(RIFF コンテナ)
WebP のヘッダー
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 52494646241A00005745425056503858 | RIFF$...WEBPVP8X | |||||||||||||||
| 0010 | 0A00000010000000FF0000FF00000000 | .............. | |||||||||||||||
RIFF チャンクの構造
補足: チャンクのデータは、必要に応じてヌルバイトで偶数長に そろえられます。
主なオフセット
- • サブチャンクの開始位置: 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 チャンクは目次のような役割を持ち、ファイルに何が入っているかを デコーダに伝えます。メタデータのチャンクを削除したときは、このフラグも 合わせて更新しなければなりません。そうしないと、デコーダが存在しない データを探しにいってしまいます。
フラグのビット
フラグが大事な理由
PicScrub は EXIF/XMP のチャンクを削除したら、それに合わせて VP8X の フラグも更新します。そうしないと、デコーダが存在しないデータを 期待してしまうことがあります。
PicScrub が WebP を処理する流れ
RIFF ヘッダーの検証
RIFF....WEBP のシグネチャを確かめます
チャンクの解析
すべての RIFF チャンクをたどり、FourCC とサイズを読みます
メタデータのチャンクを削除
書き出すときに EXIF と XMP のチャンクを飛ばします
VP8X のフラグを更新
VP8X チャンクの EXIF/XMP のフラグビットをクリアします
ファイルサイズの再計算
新しい総ファイルサイズで RIFF ヘッダーを書き換えます
残るもの
- • VP8/VP8L の画像データ
- • ALPH のアルファチャンネル
- • ANIM/ANMF のアニメーションデータ
- • ICCP のカラープロファイル(任意)
削除されるもの
- • EXIF のメタデータ
- • XMP のメタデータ
シンプルな WebP と拡張形式の WebP
WebP ファイルに VP8X チャンクがなければ、それは「シンプルな」WebP です。 RIFF のラッパーがひとつの VP8 または VP8L チャンクを包んでいるだけの 構造です。シンプルな WebP にはメタデータを入れる余地がないので、 プライバシーを気にするなら理想的な形といえます。
シンプルな WebP
VP8 または VP8L チャンクだけ。メタデータは入りません。
拡張形式の WebP
VP8X チャンクがあり、メタデータ、アルファ、アニメーションを使えます。