JpegからAVIFへ変換するためのコマンドラインツールSquoosh, sharp, cavif

WebPとAVIFの比較をしようとLinux向けの変換ツールを調査しているときの覚書。

環境: CentOS Stream 8, Node.js v14.18.2 -> v18.9.1

AVIFの対応状況

Edge以外は対応している。


Node.jsをv18に変更

開発環境のNode.jsがv14だったので最新のv18にアップグレードする。
確認
# dnf module list nodejs

v14からv18に変更
# dnf module reset nodejs
# dnf module enable nodejs:18
# dnf --allowerasing distro-sync

確認
# node --version

v18.9.1


Squoosh CLI

Chrome teamが開発している画像圧縮ウェブツール「Squoosh 」をコマンドラインで使えるようにしたもの。

Globalでインストール
# npm i -g @squoosh/cli

AVIFに変換してみる。
$ squoosh-cli --avif '{quality: 30}' key-visual.jpg

TypeError: Failed to parse URL from /usr/local/lib/node_modules/@squoosh/cli/node_modules/@squoosh/lib/build/imagequant_node-a4aafbae.wasm

エラーになった。

ウェブアプリ版のSquooshでAVIF変換したら問題なく完了した。
Quality: 30
Effort: 4

ファイルサイズ比較
Jpeg: 281KB
WebP: 70KB
AVIF: 26KB

Jpegの10分の1でWebPの半分なのにGoogle Chromeで表示して並べてみても違いが分からない。

とりあえずsquoosh-cliはアンインストール。
# npm uninstall -g @squoosh/cli

そのうち直っていることを期待。
Squooshをnpm runで使えるように書こうかな…。


sharp

検索して見つけたNode.js製画像変換ツール「sharp」。
これもcliバージョンを使う。

Globalでインストール
# npm install -g sharp-cli

AVIFに変換してみる。
$ sharp --format avif --input key-visual.jpg --output key-visual.avif

出来た。
30KB。
squooshと同じオプションで再実行
$ sharp --format avif --input key-visual.jpg --output key-visual.avif --quality 30 --effort 4

17KBまでなったけど比較してみると荒い。
--qualityはデフォルトの80にするとほぼWebPと同じ。
$ sharp --format avif --effort 4 --input key-visual.jpg --output key-visual.avif

Squooshと比較すると3KB大きい。


cavif

Rust製のAVIF変換ツール

まずはRustとパッケージマネージャーのcargoをインストールする。
# dnf install rust cargo

確認
# rustc --version

rustc 1.62.1 (Red Hat 1.62.1-1.module_el8.7.0+1211+277be900)

# cargo --version

cargo 1.62.1

cavifをインストール。
# cargo install cavif

error: failed to run custom build command for `rav1e v0.5.1`

Caused by:
  process didn't exit successfully: `/tmp/cargo-installUMiRXy/release/build/rav1e-3031b01eff10ff9f/build-script-build` (exit status: 101)
  --- stdout
  cargo:rustc-cfg=nasm_x86_64

  --- stderr
  thread 'main' panicked at 'Couldn't find NASM, make sure NASM installed and in PATH or disable "asm" feature', /root/.cargo/registry/src/github.com-1ecc6299db9ec823/rav1e-0.5.1/build.rs:296:7
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
error: failed to compile `cavif v1.4.0`, intermediate artifacts can be found at `/tmp/cargo-installUMiRXy`

nasmが見つからないというのでnasmをインストールする。
参考: GitHub - xiph/rav1e: The fastest and safest AV1 encoder.
# dnf search nasm
# dnf install nasm 

cavifを再インストール
# cargo install cavif

warning: be sure to add `/root/.cargo/bin` to your PATH to be able to run the installed binaries

PATHへの追加は保留。

AVIFに変換してみる。
# /root/.cargo/bin/cavif key-visual.jpg

99KBで生成された。
オプションを指定して再変換。
# /root/.cargo/bin/cavif --quality 80 --speed 1 key-visual.jpg

結構な時間が掛かった。1分ぐらい?
92KBで生成された。
WebPが70KBなので意味がない。


【関連記事】