slimg - Rust製の画像最適化CLI(54GB → 8GB)
(github.com/clroot)なぜ作ったのか?
GoogleのSquooshというツールを愛用していましたが、CLI版は実行するとエラーが出て、Web版は使えるものの……Google特有の放置状態だったため、結局自分で作ることにしました。代替を探しましたが、気に入るものはありませんでした。
slimgとは?
Rustで書かれた画像最適化CLIです。JPEG、WebP、PNG、AVIF、QOI間の変換とリサイズ、品質最適化をサポートします。MozJPEG、OxiPNG、ravifのような最新コーデックを使用します。
実際の使用結果:
個人写真54GBを一括最適化したところ、8GBまで減りました。(85%削減)品質は肉眼ではほとんど違いが分からないレベルです。
# ディレクトリを一括処理(並列)
slimg convert ./photos --format webp --quality 85 --recursive
# リサイズ + 変換
slimg resize photo.jpg --width 800 --format avif --quality 70
技術的な特徴:
- Rayonによる全CPUコア並列処理
- 一時ファイル → atomic renameによる安全な上書き
- ライブラリ(slimg-core)とCLIを分離(再利用可能)
- Cコーデックバインディングによるネイティブ性能
インストール:
brew install clroot/tap/slimg
# https://github.com/clroot/slimg/releases
GitHub: https://github.com/clroot/slimg
7件のコメント
slimg のKotlinバインディングが追加されました。サーバー/バックエンドで画像処理を手軽に行えます。
私も、pngで生成されたファイルで背景を削除してsvgに変換し、容量を減らしつつ品質を保持するものをLLMで作りました。Rustで作っていて、svgへの変換はとてもうまくいったのですが、svgで容量を減らすには
svgoというプログラムを使うしかありませんでした。svgoはsvgで不要なコードを削減する技術に優れているのですが、これはドメイン知識が必要な部分のようで、そのためsvgoを活用していました。ところが、MozJPEG、OxiPNG、ravif のような最新コーデックを使うことは思いつきませんでした。私も一度試してみたくなりました。インスピレーションをありがとうございます。
私はこれまで SalOne22/rimage を使っていましたが、これはどうなのか見てみる必要がありそうですね。ひとまず、Python バインディングを提供しているのは利点のように思います。
slimg の Python バインディングも追加されました。
私も圧縮ファイルにまとめられている画像を一括変換してくれるツールをRustで作って使っているので、このリポジトリに内部呼び出しを変更してみようと思います。
avif のデコードが macOS でしかできないのは、何か特定の理由があるのでしょうか?
これで 0.1.3 バージョンを使用すると、Windows、Linux でも AVIF のデコードが可能です。
ビルドに使用した GitHub Actions 環境で、avif を扱うライブラリのバージョンに互換性がないためです。近いうちにビルド環境を修正し、Linux マシンでも avif をサポートするよう対応する予定です。