sharpのAVIF変換でeffort(エンコード速度)値を検証

nak
·
公開:2024/7/9

画像変換ライブラリsharpで画像変換する記事をメモサイトに投稿した余談です。

AVIFのeffort(エンコード速度)というオプションが容量や変換速度に大きく影響するようなので少し検証してみました。

※比較画像が13枚とかなり少ないので、あくまでも参考程度に見ていただければと思います。

先に結論

  • 基本的に変換速度を最優先にした「effort: 4(初期値)」で良さそう

    • 画像によって最もファイル容量が小さくなるeffort値はバラバラ

      • 全ての画像で必ず最小値になるようなeffort値は存在しなさそう

      • バラつきと言っても数KB程度の極少値なので、ほぼ差はないと言ってしまっても良いかも?

    • 変換速度は数値が低い順に早かった

      • effort: 9はめちゃくちゃ遅い

    • effort: 6 が結構良いスコアを出したので、速度より容量が最優先の場合は比較・検討しても良いかも

effort(エンコード速度)について

  • CPUにどれだけ負荷をかけるか

  • qualityと並んで画質に関係する設定

  • 0〜9の数値を渡せて数値が小さいほど変換速度が早くなる(その分圧縮率は悪くなると言われている)

参考 : https://sharp.pixelplumbing.com/api-output#avif

検証環境

  • MacBook Pro

    • プロセッサ 2.3GHz 8コア Intel Core i9

    • メモリ 16GB

effort: 4〜9 で検証

検証結果

  • 変換前ファイルの圧縮処理の有無

    • AVIF変換前にjpg圧縮した画像の方が容量が大きくなった

      • ひと手間かけない方は小さくなりやすいのかも

  • 処理時間

    • 4が圧倒的に早い

  • 圧縮率

    • 意外とeffort値6が良いスコアを出しやすいのかも

  • 画質

    • 変換前後や各パターンを目視で確認した限りでは違いは分からなかった

      • 拡大して細かく見ると違いはあると思うけど、よほど重要な画像ではない限りWebサイトに掲載する分には気にしなくて良いレベルだと思う

数値の詳細

  • 画像1

    • 圧縮処理なしのjpg画像(2.9MB)をAVIFに変換(最小:effort: 6)

      • effort: 9 - 185.688KB, 変換時間: 37.275秒

      • effort: 8 - 185.281KB, 変換時間: 27.941秒

      • effort: 7 - 186.205KB, 変換時間: 22.218秒

      • effort: 6 - 185.253KB, 変換時間: 12.195秒

      • effort: 5 - 186.55KB, 変換時間: 6.961秒

      • effort: 4 - 185.917KB, 変換時間: 4.965秒

    • 圧縮処理済みのjpg画像(548KB)をAVIFに変換(最小:effort: 4)

      • effort: 9 - 200.437KB, 変換時間: 32.001秒

      • effort: 8 - 198.674KB, 変換時間: 25.172秒

      • effort: 7 - 198.77KB, 変換時間: 18.725秒

      • effort: 6 - 197.813KB, 変換時間: 10.122秒

      • effort: 5 - 197.977KB, 変換時間: 6.606秒

      • effort: 4 - 196.752KB, 変換時間: 5.011秒

  • 画像2

    • 圧縮処理なしのjpg画像(3.1MB)をAVIFに変換(最小:effort: 6)

      • effort: 9 - 148.612KB, 変換時間: 31.425秒

      • effort: 8 - 147.828KB, 変換時間: 22.412秒

      • effort: 7 - 147.235KB, 変換時間: 18.826秒

      • effort: 6 - 146.481KB, 変換時間: 11.703秒

      • effort: 5 - 148.427KB, 変換時間: 8.424秒

      • effort: 4 - 147.452KB, 変換時間: 5.356秒

    • 圧縮処理済みのjpg画像(456KB)をAVIFに変換(最小:effort: 6)

      • effort: 9 - 165.236KB, 変換時間: 26.144秒

      • effort: 8 - 158.077KB, 変換時間: 18.535秒

      • effort: 7 - 157.949KB, 変換時間: 15.954秒

      • effort: 6 - 157.531KB, 変換時間: 10.534秒

      • effort: 5 - 158.694KB, 変換時間: 7.569秒

      • effort: 4 - 157.848KB, 変換時間: 4.649秒

  • 画像3

    • 圧縮処理なしのjpg画像(3.5MB)をAVIFに変換(最小:effort: 6)

      • effort: 9 - 273.928KB, 変換時間: 32.778秒

      • effort: 8 - 271.246KB, 変換時間: 21.662秒

      • effort: 7 - 271.116KB, 変換時間: 19.134秒

      • effort: 6 - 269.919KB, 変換時間: 12.53秒

      • effort: 5 - 273.328KB, 変換時間: 8.116秒

      • effort: 4 - 272.883KB, 変換時間: 5.767秒

    • 圧縮処理済みのjpg画像(632KB)をAVIFに変換(最小:effort: 4)

      • effort: 9 - 288.583KB, 変換時間: 32.055秒

      • effort: 8 - 288.165KB, 変換時間: 22.751秒

      • effort: 7 - 288.189KB, 変換時間: 20.501秒

      • effort: 6 - 288.564KB, 変換時間: 15.279秒

      • effort: 5 - 291.968KB, 変換時間: 11.222秒

      • effort: 4 - 287.145KB, 変換時間: 6.464秒

追加でミニ検証

上の写真3枚だとeffort値は4か6が良さそうに思えましたが、思っていたよりは結果がバラバラだったので無作為に10枚選んで追加検証することにしました。

  • 結論

    • 各設定値で殆ど差はないのでeffortの値は基本的に速度優先の4で良さそう

      • 画像によってバラつきが結構出そうなので、とにかくほんの少しでも容量を少なくしたい場合には4、6、9で書き出して毎回比較するしかなさそう

  • 概要

    • サイズ、画質など全てバラバラの10枚を適当にピックアップ(※実務で利用した画像のため掲載は割愛します)

    • effort: 9、6、4の3種類でファイルサイズを比較

  • 結果

    • effort: 9 が最もファイルサイズが少ない:4/10

    • effort: 6 が最もファイルサイズが少ない:3/10

    • effort: 4 が最もファイルサイズが少ない:3/10

    • 変換速度は全てeffort: 4 が圧倒的に早かった

  • AVIF変換の詳細

    • img01.jpg :(最小:effort: 9)

      • effort: 9 - 100.519KB, 変換時間: 18.513秒

      • effort: 6 - 100.86KB, 変換時間: 4.101秒

      • effort: 4 - 101.422KB, 変換時間: 1.99秒

    • img02.jpg(最小:effort: 6)

      • effort: 9 - 66.477KB, 変換時間: 75.835秒

      • effort: 6 - 66.159KB, 変換時間: 15.516秒

      • effort: 4 - 66.406KB, 変換時間: 13.389秒

    • img03.jpg(最小:effort: 9)

      • effort: 9 - 149.812KB, 変換時間: 25.97秒

      • effort: 6 - 149.956KB, 変換時間: 8.602秒

      • effort: 4 - 149.908KB, 変換時間: 3.867秒

    • img04.jpg(最小:effort: 9)

      • effort: 9 - 42.862KB, 変換時間: 8.01秒

      • effort: 6 - 42.97KB, 変換時間: 2.272秒

      • effort: 4 - 43.568KB, 変換時間: 1.137秒

    • img05.jpg(最小:effort: 4)

      • effort: 9 - 76.82KB, 変換時間: 24.817秒

      • effort: 6 - 76.161KB, 変換時間: 8.008秒

      • effort: 4 - 75.584KB, 変換時間: 3.859秒

    • img06.jpg(最小:effort: 9)

      • effort: 9 - 106.784KB, 変換時間: 29.711秒

      • effort: 6 - 107.662KB, 変換時間: 7.267秒

      • effort: 4 - 109.565KB, 変換時間: 3.521秒

    • img07.jpg(最小:effort: 6)

      • effort: 9 - 23.821KB, 変換時間: 58.166秒

      • effort: 6 - 22.872KB, 変換時間: 16.858秒

      • effort: 4 - 22.971KB, 変換時間: 12.132秒

    • img08.jpg(最小:effort: 4)

      • effort: 9 - 85.497KB, 変換時間: 40.143秒

      • effort: 6 - 84.105KB, 変換時間: 11.774秒

      • effort: 4 - 83.157KB, 変換時間: 5.424秒

    • img09.jpg(最小:effort: 4)

      • effort: 9 - 11.394KB, 変換時間: 35.107秒

      • effort: 6 - 11.282KB, 変換時間: 10.548秒

      • effort: 4 - 11.28KB, 変換時間: 4.879秒

    • img10.jpg(最小:effort: 6)

      • effort: 9 - 55.677KB, 変換時間: 138.747秒

      • effort: 6 - 55.664KB, 変換時間: 20.709秒

      • effort: 4 - 56.298KB, 変換時間: 12.726秒

@nak
Webのはしっこでコーダーをしています。 coding-memo.work