.webp…一体何者なんだ

謎の企業Googleが作成した謎の画像形式webp

Google検索によるとこの謎の画像形式webpは
謎の企業Googleが作成した謎の画像形式らしい
謎の拡張子webmもあり、そちらは動画形式のようだ
仕組み的にはwebpはwebmの1フレームらしい
謎である

webpの特徴

概ね以下のようだ

  • ・png/jpgとそれぞれ可逆、非可逆双方で圧縮率が高い
  • ・元々動画形式なのでgifもOK
  • ・現在は主要な環境では対応済みで特に不自由はない
  • ・ただしwindowsでは標準で表示できないので対応が必要(後述)

最近の画像形式を見直す

webpの事は大体わかった
最近の他形式はどうなのだろうか
可逆=png,非可逆=jpgで完全に頭が止まっていたので調べ直してみる

png/jpgとの比較

既存の画像形式と比較してどのような利点があるのか
jpg/pngファイルの混合であるアイギス画像フォルダを
各々圧縮して比較を行う

コマンドラインツールのインストール

作業はMacでそれぞれ以下のコマンドを使用
webp -> cwebp 1.3.0
jxl -> cjxl v0.8.1
avif -> avifenc 0.11.1

圧縮方法はpngはロスレス、jpgは画質80
avifは圧縮5設定

元サイズ
758MB
画像形式:圧縮後サイズ:圧縮率
webp  :  489MB   :  65%
avif  :  667MB   :  88%
jxl   :  441MB   :  56%

webp、jxlは圧縮率がかなり良い、avifは伸び悩んでいる
様子を見ているとpng圧縮時に逆に大きくなっている事が多い
jpgは5割、上手くいっている時のpngは3割程度圧縮しているのだが

また、エンコード速度はavifが圧倒的に遅い。speedは中間のつもりなのだが…
ここは詰める必要があるかもしれない
jxlはそこそこ遅くなるが許容範囲
webpは早い、そして画質80でやったがデフォルト(推奨)は75なので
もう少し早く小さくなるはず

使用コード

to_webp.sh

#!/bin/bash

if [ "$#" -ne 2 ]; then
  echo "Error: Invalid number of arguments."
  echo "Usage: $0 source_folder output_folder"
  exit 1
fi

source_folder="$1"
output_folder="$2"

if [ ! -d "$source_folder" ]; then
  echo "Error: Source folder does not exist."
  exit 1
fi

if [ ! -d "$output_folder" ]; then
  echo "Error: Output folder does not exist."
  exit 1
fi

for file in "$source_folder"/*; do
  if [ -f "$file" ]; then
    filename=$(basename -- "$file")
    extension="${filename##*.}"
    filename="${filename%.*}"
    if [ "$extension" == "png" ]; then
      cwebp -lossless "$file" -o "$output_folder/$filename.webp"
    elif [ "$extension" == "jpg" ] || [ "$extension" == "jpeg" ]; then
      cwebp -q 80 "$file" -o "$output_folder/$filename.webp"
    fi
  fi
done

to_jxl.sh コマンド部分のみ

    if [ "$extension" == "png" ]; then
        cjxl -q 100 "$file" "$output_folder/$filename.jxl"
    elif [ "$extension" == "jpg" ] || [ "$extension" == "jpeg" ]; then
      echo "convert jpg: $file"
      cjxl -q 80 --lossless_jpeg=0 "$file" "$output_folder/$filename.jxl"
    fi

to_avif.sh コマンド部分のみ

    if [ "$extension" == "png" ]; then
      avifenc -c aom --lossless --speed 5 "$file" "$output_folder/$filename.avif"
    elif [ "$extension" == "jpg" ] || [ "$extension" == "jpeg" ]; then
      avifenc -c aom --speed 5 "$file" "$output_folder/$filename.avif"
    fi

コマンドを詰めればavifも改善するかも
また、上記コードは

waless「png/jpgをwebp/jxl/avifに変換するバッチ書いて(はぁと」
ChatGPT先輩「アイヨー」
waless「これファイル名じゃなくて相対パスになってない?」
ChatGPT先輩「あ、間違ってますね。修正しました」
waless「あ、Macでやるからバッチじゃなくてシェルだったわ…」
ChatGPT先輩「しょうがないにゃあ」

というやりとりで作成されました

webp/jxl/avifの扱い方

標準ではwindowsでは扱えないのでwebpすら無理…だと…?
対応方法は以下

webp

Windows
webpコーデックをインストール
(exe直は怪しさMAXな気がしたのでここからWebpCodecSetup.exeを)
フォトビューワーも使用できるようになる
が、何か画像が暗くなる。エクスプローラでは問題ない
ビューワーの拡張機能が衝突しているよう
PowerShellで設定してやれば良いらしいがうまくいかず
この辺りで面倒になったので別のフォトビューワーを使用する事に(ぉぃ
-> honeyviewが枠を消せてグッド

Mac
標準で対応

avif

Windows, Mac共に標準対応

jxl

Windows, Mac共に標準では対応していない
honeyviewも対応しておらず
XnViewMPが対応しているよう

ゲームエンジンでの対応

ゲームエンジンではどうだろうか
インポート元画像として使用できなければ普段遣いしていると不便である

UE5

  • ・webp -> 駄目
  • ・jxl -> 駄目
  • ・avif -> 駄目

Unity

  • ・webp -> 駄目
  • ・jxl -> 駄目
  • ・avif -> 駄目

全滅☆


せめてwebpは使いたいので調べていると
UE/Unity共にプラグインを作っている方がおられるようだ

webp-UE
webp-Unity
jxl/avif => 見当たらない?

結果

webp、良い奴じゃないか…ありがとう謎の企業Google先生
windows対応をすれば基本webpにしていって良いかもしれない
ブログ画像は全て置き換えて4-5割サイズカットといった所

avifはAV1でGPU処理が始まっているのでそこから本気出す感じだろうか
jxlは優等生なのだが周辺がまだといった印象


ここまで書いていて最もサイズ削減したいのは
動画と気づいたので次は動画ですね
こっちは多分AV1で良いのかな?