AVIF変換: FreeBSD14 + ImageMagick7-nox11 → libavif
FreeBSD14の環境でAVIF変換をしたときの覚書。
環境: FreeBSD 14.3-RELEASE-p2, ImageMagick 7.1.1
1. ImageMagick7をインストール
ImageMagick7をインストールする。
GUIは使わないのでnox11をインストール。
# pkg search ImageMagick
# pkg install ImageMagick7-nox11
バージョン確認。
# magick --version
Version: ImageMagick 7.1.1-45 Q16-HDRI aarch64 22722 https://imagemagick.orgCopyright: (C) 1999 ImageMagick Studio LLCLicense: https://imagemagick.org/script/license.phpFeatures: Cipher DPC HDRI ModulesDelegates (built-in): bzlib fftw fontconfig freetype heic jbig jng jp2 jpeg jxl lcms lqr ltdl lzma openexr png raw tiff webp wmf xml zip zlib zstdCompiler: clang (18.1.6)
対応フォーマットの確認。
AVIFサポートを確認。
# magick -list format
# magick -list format | grep AVIF
AVIF HEIC rw+ AV1 Image File Format (1.19.8)
libavifにavifencが含まれていことが分かったので、ImageMagick7をアンインストールする。
単機能アプリの方がメンテナンスが楽な分、ライブラリが新しくバグが少ない。
ImageMagick7をアンインストール。
# pkg remote ImageMagick7-nox11
不要な依存関係の確認(ドライラン)して削除する。
# pkg autoremove -n
# pkg autoremove
2. avifencをインストール
libavifにavifencが含まれている。
# pkg install libavif
バージョン確認。
# avifenc --version
Version: 1.3.0 (dav1d [dec]:1.5.1, aom [enc/dec]:3.12.1)libyuv : available (1789)
CentOS Stream 10のリポジトリより新しいしlibyuvが含まれているのがいい。
下位階層まで含めて一括変換するコマンド。
# find . -name "*.jpg" -print0 | xargs -0 -I {} sh -c 'f="{}"; avifenc -q 40 -s 4 -y 420 "$f" "${f%.*}.avif"'
コマンドオプション
- -q 40: 品質を明示的に指定(0:最低, 63:最高/可逆)
- -s 4: デフォルト(6)より少し時間をかけて圧縮効率を上げる (0:最遅/高効率, 10:最速)
- -y 420: ソースのJPEG形式に合わせ、ファイルサイズの肥大化を防ぐ
開発はWindows 11から行っている。
gitコマンドとPowerShellで画像サイズが変化したか表示するコマンドはこちら。
(Gemini 2.5 Proに教えてもらった)
PS > git diff --raw HEAD | Where-Object { $_ -match "\.(jpe?g|png|gif|webp|svg|bmp)$" } | ForEach-Object { $meta, $file = $_.Split("`t"); $parts = $meta.Split(' '); $oldHash = $parts[2]; $status = $parts[4].Substring(0,1); $oldSize = if ($status -eq 'A') { 0 } else { [long](git cat-file -s $oldHash) }; $newSize = if ($status -eq 'D') { 0 } else { (Get-Item $file).Length }; $diff = $newSize - $oldSize; "File: {0}`n Old: {1,10:N0} bytes`n New: {2,10:N0} bytes`n Diff: {3,10:+#,##0;-#,##0;0} bytes`n" -f $file, $oldSize, $newSize, $diff }
avifencでオプションを指定した方がファイルサイズが小さくなっている。