Base64 を WebP に変換する手順
- Base64 か、
data:image/webp;base64,...形式の URI 全体を貼り付けます。CSS のurl()や<img>タグのように、URI を含むコードのままでもかまいません。 - ステータス行に 検出 WebP と表示されることを確認し、プレビューとその上の寸法を確かめます。アニメーション WebP はプレビューで再生されます。
- ファイルをダウンロード を押します。拡張子は
webpに設定されます。
WebP の 3 つの種類
WebP は RIFF コンテナで、WEBP タグの直後に 3 種類のチャンクのいずれかが続きます。タグは固定のオフセットにあるため、種類は Base64 でも決まった位置に現れます。
| Base64 の先頭 | チャンク | 中身 |
|---|---|---|
UklGR…XRUJQVlA4I | VP8 | 非可逆、透過なし |
UklGR…XRUJQVlA4T | VP8L | 可逆、透過を含められる |
UklGR…XRUJQVlA4W | VP8X | 拡張:アルファ付き非可逆、アニメーション、ICC プロファイル、EXIF |
UklGR と XRUJQ の間の 6 文字はファイルサイズを表し、ファイルごとに変わります。(WEBP に由来する)XRUJQ は常に 12〜16 文字目に、(VP8 に由来する)VlA4 は 17〜20 文字目にあります。注目すべきは 21 文字目で、I、T、W のいずれかです。
種類によって、ファイルを変換したときの結果が変わります。可逆 WebP は PNG の代わりとして十分使えます。非可逆 WebP はすでに細部が失われているので、PNG に変換してもファイルが大きくなるだけで画質は戻りません。拡張形式のファイルは複数のフレームを持てますが、静止画形式に変換すると最初のフレームしか残りません。
コードで WebP の種類を判別する
Python で同じ判定をするには、チャンクのタグと、拡張形式ならフラグのバイトを読みます。
import base64
def webp_kind(b64: str) -> str:
data = base64.b64decode(b64.split(",", 1)[-1])
if data[:4] != b"RIFF" or data[8:12] != b"WEBP":
return "not WebP"
chunk = data[12:16]
if chunk == b"VP8 ":
return "lossy"
if chunk == b"VP8L":
return "lossless"
flags = data[20]
parts = ["extended"]
if flags & 0x10:
parts.append("alpha")
if flags & 0x02:
parts.append("animated")
return ", ".join(parts)
Pillow で書き出した WebP ファイルに対しては、lossy、lossless、透過付き非可逆画像なら extended, alpha、アニメーションなら extended, animated を返します。詳しくは Python での Base64 をご覧ください。
RIFF が WebP とは限らない
UklGR が意味するのは「RIFF」だけです。WAV 音声や AVI 動画も同じように始まり、違いは 8〜11 バイト目のタグにあります。デコーダーはこのタグを確認するので、ここに WAV を貼り付けると「これは WebP ではなく WAV のようです。」と表示され、.wav として保存するボタンが出ます。再生するには Base64 から音声へ を使ってください。
WebP の Base64 が使われる場面
- Canvas の書き出し:
toDataURL("image/webp", quality)を使った場合です。結果は必ず確認してください。WebP エンコーダーを持たないブラウザは黙って PNG を返します。 - 画像 API や CDN:WebP を受け付けるクライアントには WebP を返します。ブラウザが取得した画像なら、
thumbnail_jpgという名前のフィールドにも WebP が入っていることがあります。 - インラインのプレースホルダーやアイコン:HTML や CSS では、WebP のほうが PNG や JPEG より短い文字列になります。
- チャットのスタンプ:WebP であることが多く、アニメーションの場合もあります。
古いプログラムが保存したファイルを受け付けない場合は、ここに表示される SHA-256 と、プログラムが受け取ったファイルのハッシュを比べてください。一致するなら、そのプログラムが WebP を読めないということなので、PNG か JPEG のコピーを渡すのが解決策です。
よくある質問
Base64 の WebP が非可逆か可逆かを見分けるには?
文字列の 21 文字目を見てください。VlA4 に続く文字が I なら非可逆の VP8 画像、T なら可逆の VP8L 画像、W なら拡張形式で、透過付きの非可逆画像やアニメーションはこれを使います。
デコードした WebP を PNG や JPG で保存できますか?
名前を変えるだけではできません。バイト列は WebP のままです。.webp をダウンロードしてから、WebP から Base64 へ で 変換先 に PNG か JPEG を選び、できた文字列を Base64 から PNG へ でデコードしてください。
canvas.toDataURL('image/webp') で PNG が返ってきたのはなぜですか?
WebP をエンコードできないブラウザ(特に Safari)は、何も言わずに代わりに PNG の data URI を返します。結果をここに貼り付けて PNG と表示されたら、それが起きています。
古い Mac や iPhone でプレビューが失敗するのはなぜですか?
Safari 14 と 15 が WebP を表示できるのは macOS 11 Big Sur 以降だけで、Safari 14 より前ではまったく表示できません。その場合プレビューにはブラウザが画像を表示できない旨が出ますが、ファイルをダウンロード では有効な .webp が保存されます。