TL;DR
前回の 画像圧縮するベストな方法(2025)では、ロッシーな不可逆圧縮の方法の紹介をしました。
今回は、「ロスレス」。
つまり全く劣化しない可逆圧縮の方法を比較します。
結論は、Web配信(ブラウザ互換)を最優先するなら WebP(lossless)が現実解。
最高圧縮は JPEG XL だが、ブラウザ対応がまだ限定的。
ベンチマークの順序は下記になります。
JPEG-XL > WebP > PNG > AVIF
はじめに
ロッシーな不可逆圧縮は、ロゴやテキストを含む画像などの平坦な画像を圧縮すると、圧縮ノイズや色あいの劣化が目立ちます。
このような場合は、通常、ロスレス圧縮を使います。
代表的なロスレス圧縮フォーマットはpngです。
一切劣化しないため、非可逆圧縮と違って画質とサイズのトレードオフは考える必要がありません。
写真などの画像はロスレスではあまり小さくなりませんが、ロゴやパワポの画像、PCスクリーンショット画像などは、ロッシーな圧縮よりも小さくなることが多いです。
このロスレス圧縮を実装している画像フォーマットは沢山ありますが、
の2系統があります。
前者は、最初からロスレス専用でアルゴリズムが設計されており、後者はロッシーな圧縮とほとんど同じフローでロスレス圧縮を実現します。
AVIFにはロスレス圧縮もありますが、ロスレス専用モードが特化型で作られているわけではないため、ロッシーな圧縮と違って性能は高くありません。
コマンドは下記になります。
JPEG XLはlosslessを明示的に指示しなくてもq=100でロスレスになります。
あと--allow_expert_optionsオプションでエフォート-e 11が解禁されます(デフォルトは10)
# AVIF
avifenc --lossless -s 0 -j 16 input.png output.avif
# WebP
cwebp -lossless -z 9 -mt input.png -o output.webp
#JPEG XL
cjxl input.png output.jxl -q 100 -e 11 --allow_expert_options --num_threads=16
比較方法
いろいろな可逆圧縮フォーマットで自然画像やスクリーンショット画像、ベクター画像を圧縮しました。
エンコーダ
使ったエンコーダは下記です。
- png level 0-9 (大きいほど高圧縮)
- JPEG LS
- JPEG 2000
- JPEG XR
- JPEG XL 0-11 (大きいほど高圧縮で11はExperimental モードを有効化しないと使用不可)
- WebP 0-9 (大きいほど高圧縮)
- HEIF 0-9 (大きいほど高圧縮)
- AVIF 0-9 (小さいほど高圧縮)
また,ロッシーな非可逆圧縮ですが,最高品質設定にして参照情報も取りました.
- JPEGでYUV444のQP100設定
- AVIFのロッシー版でYUV444のQP100設定
比較画像
以下の2つの画像データセットを使いました。
SCID
- パワーポイントっぽい画像だったり、スクリーンショット画像だったり
- 1280 x 720 が40枚
CID22
- 自然画像(229枚)が多めでたまにベクター画像(21枚)が入っている
- 512 x 512 が250枚
結果
下記に、圧縮結果した平均のサイズ[bpp], エンコード時間[秒]、デコード時間[秒]の結果を示します。
- bpp (bits per pixel) は「1画素あたり何ビットで表現されているか」を表し、小さいほど高圧縮。24が最大値
- 使用したマシンは、AMD Ryzen9 9950X
最大でスクショ画像(SCID)は12%くらい、自然画像(CID22)は30%くらいになりました。
表:SCIDの圧縮結果
| method | bpp | enc. [sec] | dec. [sec] |
|---|---|---|---|
| JPEGXL 11 | 3.067 | 67.718 | 0.069 |
| JPEGXL 10 | 3.278 | 8.459 | 0.018 |
| JPEGXL 7 | 3.550 | 0.539 | 0.016 |
| Webp 9 | 3.560 | 1.864 | 0.006 |
| Webp 0 | 4.522 | 0.015 | 0.007 |
| AVIF (lossy) | 4.533 | 4.707 | 0.031 |
| JPEGLS | 5.143 | 0.020 | 0.018 |
| PNG 9 | 5.145 | 0.025 | 0.006 |
| AVIF 0 | 5.899 | 4.735 | 0.035 |
| JPEG2K | 6.476 | 0.009 | 0.008 |
| HEIC 9 | 7.087 | 0.209 | 0.054 |
| JPEG (lossy) | 7.389 | 0.012 | 0.005 |
| JPEGXR | 8.060 | 0.017 | 0.017 |
SCID全データ(クリックで展開)
| method | bpp | enc. [sec] | dec. [sec] |
|---|---|---|---|
| JPEGXL 11 | 3.067 | 67.718 | 0.069 |
| JPEGXL 10 | 3.278 | 8.459 | 0.018 |
| JPEGXL 9 | 3.403 | 2.412 | 0.018 |
| JPEGXL 8 | 3.463 | 1.551 | 0.017 |
| JPEGXL 7 | 3.550 | 0.539 | 0.016 |
| Webp 9 | 3.560 | 1.864 | 0.006 |
| Webp 8 | 3.641 | 0.547 | 0.006 |
| Webp 7 | 3.685 | 0.263 | 0.006 |
| JPEGXL 6 | 3.702 | 0.390 | 0.016 |
| Webp 6 | 3.710 | 0.189 | 0.006 |
| Webp 4 | 3.748 | 0.156 | 0.006 |
| Webp 5 | 3.748 | 0.155 | 0.006 |
| Webp 3 | 3.749 | 0.151 | 0.006 |
| JPEGXL 5 | 3.803 | 0.330 | 0.015 |
| Webp 2 | 3.914 | 0.130 | 0.006 |
| Webp 1 | 4.064 | 0.083 | 0.006 |
| JPEGXL 4 | 4.457 | 0.182 | 0.013 |
| Webp 0 | 4.522 | 0.015 | 0.007 |
| AVIFlossy | 4.533 | 4.707 | 0.031 |
| JPEGXL 3 | 4.884 | 0.030 | 0.012 |
| JPEGLS | 5.143 | 0.020 | 0.018 |
| PNG 9 | 5.145 | 0.025 | 0.006 |
| PNG 8 | 5.209 | 0.024 | 0.006 |
| PNG 7 | 5.230 | 0.023 | 0.006 |
| JPEGXL 2 | 5.234 | 0.026 | 0.007 |
| PNG 6 | 5.272 | 0.022 | 0.006 |
| PNG 5 | 5.307 | 0.021 | 0.006 |
| PNG 4 | 5.352 | 0.018 | 0.006 |
| PNG 3 | 5.418 | 0.018 | 0.006 |
| JPEGXL 0 | 5.464 | 0.005 | 0.006 |
| JPEGXL 1 | 5.464 | 0.004 | 0.006 |
| PNG 2 | 5.568 | 0.015 | 0.006 |
| AVIF 0 | 5.899 | 4.735 | 0.035 |
| AVIF 1 | 6.127 | 3.578 | 0.036 |
| AVIF 2 | 6.145 | 2.562 | 0.036 |
| AVIF 3 | 6.159 | 1.487 | 0.036 |
| AVIF 4 | 6.169 | 0.834 | 0.036 |
| AVIF 5 | 6.212 | 0.620 | 0.037 |
| AVIF 6 | 6.399 | 0.284 | 0.037 |
| JPEG2K | 6.476 | 0.009 | 0.008 |
| HEIC 9 | 7.087 | 0.209 | 0.054 |
| HEIC 8 | 7.091 | 0.193 | 0.055 |
| HEIC 7 | 7.091 | 0.193 | 0.055 |
| HEIC 6 | 7.117 | 0.179 | 0.055 |
| HEIC 5 | 7.120 | 0.172 | 0.055 |
| HEIC 3 | 7.123 | 0.171 | 0.055 |
| HEIC 2 | 7.123 | 0.171 | 0.055 |
| HEIC 4 | 7.123 | 0.169 | 0.055 |
| HEIC 1 | 7.124 | 0.150 | 0.055 |
| PNG 1 | 7.267 | 0.015 | 0.006 |
| JPEG | 7.389 | 0.012 | 0.005 |
| AVIF 7 | 7.512 | 0.166 | 0.042 |
| AVIF 8 | 7.912 | 0.111 | 0.044 |
| JPEGXR | 8.060 | 0.017 | 0.017 |
| HEIC 0 | 9.150 | 0.091 | 0.049 |
| AVIF 9 | 9.350 | 0.065 | 0.048 |
| PNG 0 | 24.045 | 0.010 | 0.003 |
表:CID22の圧縮結果
| method | bpp | enc. [sec] | dec. [sec] |
|---|---|---|---|
| JPEGXL 11 | 7.322 | 33.042 | 0.037 |
| AVIF (lossy) | 7.485 | 4.508 | 0.013 |
| JPEGXL 10 | 7.532 | 3.230 | 0.014 |
| JPEGXL 4 | 8.114 | 0.058 | 0.011 |
| Webp 9 | 8.134 | 1.803 | 0.003 |
| JPEGLS | 8.412 | 0.009 | 0.008 |
| JPEG2K | 8.809 | 0.004 | 0.003 |
| JPEG (lossy) | 8.876 | 0.004 | 0.002 |
| Webp 0 | 9.493 | 0.007 | 0.003 |
| AVIF 0 | 9.540 | 4.448 | 0.014 |
| JPEGXR | 10.208 | 0.007 | 0.006 |
| PNG 9 | 11.088 | 0.013 | 0.003 |
| HEIC 9 | 11.589 | 0.135 | 0.025 |
SCID全データ(クリックで展開)
| method | bpp | enc. [sec] | dec. [sec] |
|---|---|---|---|
| JPEGXL 11 | 7.322 | 33.042 | 0.037 |
| AVIF (lossy) | 7.485 | 4.508 | 0.013 |
| JPEGXL 10 | 7.532 | 3.230 | 0.014 |
| JPEGXL 9 | 7.555 | 0.982 | 0.014 |
| JPEGXL 8 | 7.616 | 0.758 | 0.014 |
| JPEGXL 7 | 7.662 | 0.204 | 0.013 |
| JPEGXL 6 | 7.765 | 0.140 | 0.013 |
| JPEGXL 5 | 7.890 | 0.109 | 0.012 |
| JPEGXL 4 | 8.114 | 0.058 | 0.011 |
| Webp 9 | 8.134 | 1.803 | 0.003 |
| JPEGXL 3 | 8.156 | 0.016 | 0.009 |
| Webp 8 | 8.214 | 0.308 | 0.003 |
| Webp 7 | 8.321 | 0.097 | 0.003 |
| Webp 6 | 8.332 | 0.082 | 0.003 |
| Webp 5 | 8.341 | 0.069 | 0.003 |
| Webp 4 | 8.342 | 0.070 | 0.003 |
| Webp 3 | 8.345 | 0.068 | 0.003 |
| JPEGLS | 8.412 | 0.009 | 0.008 |
| Webp 2 | 8.531 | 0.045 | 0.003 |
| Webp 1 | 8.805 | 0.026 | 0.003 |
| JPEG2K | 8.809 | 0.004 | 0.003 |
| JPEG (lossy) | 8.876 | 0.004 | 0.002 |
| JPEGXL 2 | 9.117 | 0.011 | 0.005 |
| Webp 0 | 9.493 | 0.007 | 0.003 |
| AVIF 0 | 9.540 | 4.448 | 0.014 |
| AVIF 1 | 9.607 | 1.895 | 0.014 |
| AVIF 2 | 9.632 | 1.693 | 0.014 |
| AVIF 3 | 9.643 | 1.140 | 0.014 |
| AVIF 4 | 9.659 | 0.587 | 0.014 |
| AVIF 5 | 9.669 | 0.512 | 0.014 |
| JPEGXL 0 | 9.827 | 0.004 | 0.005 |
| JPEGXL 1 | 9.827 | 0.003 | 0.004 |
| AVIF 6 | 9.862 | 0.208 | 0.015 |
| JPEGXR | 10.208 | 0.007 | 0.006 |
| PNG 8 | 11.001 | 0.012 | 0.003 |
| PNG 7 | 11.032 | 0.012 | 0.003 |
| PNG 9 | 11.088 | 0.013 | 0.003 |
| PNG 6 | 11.176 | 0.011 | 0.003 |
| PNG 5 | 11.254 | 0.011 | 0.003 |
| PNG 4 | 11.289 | 0.009 | 0.003 |
| AVIF 7 | 11.405 | 0.122 | 0.017 |
| PNG 3 | 11.418 | 0.009 | 0.003 |
| HEIC 9 | 11.589 | 0.135 | 0.025 |
| HEIC 7 | 11.589 | 0.123 | 0.025 |
| HEIC 8 | 11.589 | 0.123 | 0.025 |
| HEIC 1 | 11.600 | 0.098 | 0.026 |
| HEIC 2 | 11.600 | 0.107 | 0.025 |
| HEIC 3 | 11.600 | 0.107 | 0.025 |
| HEIC 4 | 11.600 | 0.107 | 0.025 |
| HEIC 5 | 11.602 | 0.109 | 0.025 |
| HEIC 6 | 11.603 | 0.113 | 0.025 |
| AVIF 8 | 11.645 | 0.081 | 0.017 |
| PNG 2 | 11.677 | 0.007 | 0.003 |
| AVIF 9 | 12.448 | 0.043 | 0.018 |
| HEIC 0 | 14.067 | 0.059 | 0.022 |
| PNG 1 | 16.183 | 0.007 | 0.003 |
| PNG 0 | 24.056 | 0.004 | 0.001 |
JPEG XL
- ブラウザ対応状況を考えなければJPEG XLが最善です
- 計算時間の限界突破したモード(レベル11)で圧縮するとかなり小さくなります
- 計算時間の限界突破したモード(レベル11)で圧縮すると、ロッシーなAVIF最高品質よりも小さくなります
- スクショ画像は、レベル7くらい,自然画像はレベル4くらいでWebPよりも高速で小さくなります
WebP
- WebPはブラウザ表示可能なものの中では最も小さいです
- pngに比べて、自然画像もスクショ画像も70%くらいのサイズになってます
- WebP最速オプションは、最も重たいpng(レベル9)よりも高速でファイルサイズも小さいです
png
- 互換性だけが取り柄です
- Googleのzopfliを使って総当たりでpngを試せば、pngレベル9から更に90%(スクショ画像で4.7bpp,自然画像で10bpp)くらいにはできるのですが、計算時間は1000倍以上かかるわりに、WebPの最速オプション以下の性能しかないため除外してます
AVIF
- スクショ画像ではpng以下です
- 自然画像はpngを上回ります
- AVIF (lossy)と書いてあるのは、ロッシーな圧縮で画像は劣化しています
- 参考までに表示しているものです
JPEG, AVIFのlossyな圧縮
- 劣化はするけど最大品質で設定した方法です
- 劣化させないものよりもサイズが大きいため、スクリーンショットのような画像でロッシーにする意味はありません
- 自然画はさすがにロッシーな圧縮が強いです
- JPEG-XLの計算時間限界突破設定以外には最も良かったです
まとめ
用途別のおすすめ
- WebP → ロスレスWeb 配信
- JPEG XL → 将来性・最高圧縮(非 Web)
- PNG → 互換性最優先
- AVIF → ロスレス用途はおすすめしません
JPEG XLのブラウザ対応状況
なお、PNG、WebP、AVIFはメジャーなブラウザは全て閲覧可能です。