覚書です。
WebPとAVIFのGUIとCLIの比較表!違いは?どっちを使う?
容量はこうなります。
AVIF < WebP < JPEG
特に写真では WebPより20〜40%小さい ケースが珍しくありません。
| 用途 | おすすめ |
|---|---|
| ブログ・Webサイト | WebP |
| 写真 | AVIF |
| イラスト・UI | WebP(場合によってはPNG) |
| スクリーンショット | WebP |
| 編集用マスター | PSD → Lossless WebP |
WebPとAVIFまわりのツールをを調査しました。
| 順位 | 方式 | WebP | AVIF | GUI | CLI | Mac | Windows | 一括処理 | 無料 | ライブラリ | おすすめ度 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 🥇 | cwebp + avifenc | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅(シェル・PowerShell・Node.jsなど) | ✅ | libwebp / libavif | ★★★★★(コマンドラインを使えるなら) |
| 🥈 | Alic | ✅ | ✅ | ✅ | ❌ | ✅ | ? | ✅ | ✅ | ? | ★★★★☆ |
| 🥉 | Zipic Pro | ✅ | ✅ | ✅ | ✅ | ✅ | 開発中 | ✅ | ❌Free版と買い切りのPro版あり。Free版はAVIFに対応していない | libwebp / libavif | ★★★★☆ |
| Squoosh | ✅ | ✅ | ✅(PWA) | ❌ | △ | △ | ❌ | ✅ | libwebp / libavif | ★★★☆☆ | |
| Smolr | ✅ | ✅ | ✅ | ❌ | ✅ | ? | ✅ | ✅ | ? | ★★★☆☆ |
次の条件で探しました。
- 一括変換可
- 無料
- ライブラリが明記している
GUIのツールは決め手に欠け、結局、コマンドラインを採用することにしました。買い切り有料版のZipic Proでもいいかもしれません。Alicはよさそうだったけど、ライブラリの中身がよくわかりませんでした(ぱっと見で詳しくは調査していません)
libwebpとは?
libwebp はライブラリです。
| コマンド | 用途 |
|---|---|
| cwebp | PNG・JPEGなど → WebP |
| dwebp | WebP → PNGなど |
| img2webp | 複数画像 → アニメーションWebP |
| gif2webp | GIF → アニメーションWebP |
| webpmux | メタデータ編集・アニメーション編集 |
| vwebp | ビューア |
libwebp の開発元と公式
正式には
Google / WebM Project
です。
libwebpのインストール
brew install webp入るもの。
- cwebp
- dwebp
- img2webp
- gif2webp
- webpmux
など。
cwebp -versionlibwebpの使い方
cwebp input.webp -q 80 -m 6 -mt -o output.webpただし、二重圧縮には注意です。
WebPはJPEGと同じ「非可逆圧縮(Lossy)」です。
つまり
PSD
↓
WebP(100%)
でも、100%だからといって元画像と完全一致ではありません。
Googleの cwebp の -q 100 も「最高品質の非可逆圧縮」であり、「可逆圧縮(Lossless)」ではありません。
つまり
PNG
↓
WebP(100%)
と
WebP(100%)
↓
WebP(80)
では後者は二度圧縮になります。
cwebp -q 80 image.png -o image.webpWebPの場合はどうしたらいいのでしょう。
Lossless WebPならOKです。理論上 PNGと同等品質 です。Photoshopの「劣化なし」は Lossless WebP です。
フォルダ内のファイルを一括置換
バックアップは取得の上、一括置換するサンプルです。
for f in *.webp; do tmp="${f%.webp}.tmp.webp"; cwebp -q 85 -m 6 -mt "$f" -o "$tmp" && mv "$tmp" "$f"; done改行するとこうなります。
for f in *.webp
do
tmp="${f%.webp}.tmp.webp"
cwebp -q 85 -m 6 -mt "$f" -o "$tmp" && mv "$tmp" "$f"
donefor f in *.webp意味は「このフォルダにあるすべての .webp ファイルを1つずつ取り出す」
例えばフォルダが
manga01.webp
manga02.webpなら、シェルは内部的に
1回目
f="manga01.webp"
2回目
f="manga02.webp"として実行します。
つまりfは
現在処理しているファイル名が入る変数です。
dodoは
ここから繰り返し処理を始めます
という意味です。
例えばC言語なら
for (...) {Pythonなら
for ...:に相当します。
tmp="${f%.webp}.tmp.webp"cwebp は入力ファイルと出力ファイルを同じ名前にすることはできません。
cwebp -q 85 -m 6 -mt input.webp -o input.webp上書きしたい場合、一度テンポラリファイルを作って、成功したら置き換えるのが一般的です。
${f%.webp}${f%.webp} は「拡張子を外す」と覚えるとよいです。
f="manga01.webp"だったとします。
manga01になります。
つまり
.webpだけを削除しています。
その後ろに
.tmp.webpを付けます。
結果
tmp="manga01.tmp.webp"になります。
つまり
f
↓
manga01.webp
tmp
↓
manga01.tmp.webpになります。
-q 85
Quality(画質)
0 ~ 100
- 100 = 最高画質
- 80〜85 = ブログ画像では非常におすすめ
- 75 = 容量重視
- 60以下 = かなり劣化が見え始める
写真なら80前後がよく使われます。
イラストなら85くらいから試すのがおすすめです。
-m 6
Method(圧縮アルゴリズム)
0 ~ 6
これは
画質ではありません。
圧縮にどれだけ時間をかけるかです。
| 値 | 速度 | 圧縮率 |
|---|---|---|
| 0 | 最速 | 低い |
| 3 | 普通 | 普通 |
| 6 | 最遅 | 最高 |
画質は同じです。
違うのは
容量
だけです。
なので
常に6がおすすめです。
-mt
Multi Thread
CPUを全部使います。
MacBookなら
8コア
10コア
12コア
全部使います。
付けない理由がありません。
cwebp … "$f" -o "$tmp"出力ファイル
-o output.webp
という意味です。
現在のファイル
↓
一時ファイル
へ変換しています。
つまり
manga01.webp
↓
manga01.tmp.webp
です。
&&これはシェルでよく使います。
意味は
前が成功したら次を実行する
例えば
mkdir test && cd test
なら
mkdir成功
↓
cd
です。
もし
mkdir失敗
なら
cd
は実行されません。
&&これはシェルでよく使います。
意味は
前が成功したら次を実行する
例えば
mkdir test && cd testなら
mkdir成功
↓
cd
です。
もし
mkdir失敗
なら
cd
は実行されません。
mv "$tmp" "$f"mv
つまり
Move(移動)
です。
でも同じフォルダなので、
実際は
名前変更
になります。
つまり
manga01.tmp.webp
↓
manga01.webp
になります。
結果的に
元ファイルが置き換わります。
done繰り返し終了です。
libavifとは?
AOMediaCodecの開発元はすごいメンバーみたいですね。
次のサイトのフッター部にGitHUBのリンクがあります。
代表的なメンバーには
- Apple
- Microsoft
- Amazon
- Meta
- Netflix
- Intel
- NVIDIA
などが参加しています
libavifの使い方
avifenc --quality 50 --speed 4 --jobs all manga01.webp manga01.avif--quality 50画質を指定します。
0 ~ 100
- 100 = 最高画質
- 50 = GoogleやNetflixなどでもよく使われる実用的な設定
- 40 = 容量重視
- 60 = 高画質
WebPとはスケールが異なるため、WebPの85 ≒ AVIFの50前後と考えてください。
--speed 4圧縮速度です。
0 ~ 10
| 値 | 速度 | 圧縮率 |
|---|---|---|
| 0 | 最も遅い | 最高 |
| 4 | おすすめ | 高い |
| 10 | 最速 | 低い |
cwebp の -m に近い役割です。
4 をおすすめします。
--jobs allCPUを全部使います。
cwebp の
-mt
に相当します。
manga01.webp入力ファイルです。
manga01.avif出力ファイルです。
libavifで一括変換の方法
for f in *.webp; do avifenc --quality 50 --speed 4 --jobs all "$f" "${f%.webp}.avif"; donefor f in *.webp;このフォルダにある すべての WebP を1枚ずつ処理します。cwebpの場合と同様です。
"${f%.webp}.avif"例えば
manga01.webp
↓
manga01
↓
manga01.avif
になります。
つまり
拡張子だけ .avif に変えているわけです。

コメント