Back

图像压缩算法对比

对比各大有损图像压缩算法表现。

所谓有损压缩,即不保留原样,刻意丢失图像信息,以达到压缩目的。

有损压缩所需考虑的,是如何丢失为「佳」。

常见有损压缩格式

似乎没什么必要自己再写一遍,自行参照 Wikipedia: 图形文件格式比较

压缩测试

压缩脚本与测试图像下载,仅供学习交流使用,本人无图像版权。

Google Drive

使用 vips 命令行工具压缩。

本次测试的算法有:

  • PNG(输入)
  • JPEG
  • JPEG 2000
  • GIF
  • WEBP
  • HEIF
  • AV1

均以极限 CPU Effort 测试,能够 YUV420 重采样的,测试了该项。其中 WEBPHEICAV1libvips 无法转码 YUV444.

分别测试了以下 Q 值(若可行):

  • [25, 50, 75, 100]

如果支持无损压缩,测试了无损。

使用 zsh 脚本批处理,样例如下:

#!/bin/zsh

outdir="jpegQ75" # 输出目录

[[ -d /$outdir ]] || mkdir $outdir
for f (*.(bmp|jpg|jpeg|png)) { # 遍历图像, 但其实只有 png 起作用了
 # 压缩参数
  vips jpegsave $f ./$outdir/${f%.*}.jpeg -Q 75 --strip --optimize-coding --subsample-mode off
}

测试图像总共有 14 张,涵盖街景、2D 动画、3D 渲染图、物件、高色度图像、人像六类。

结果分析

大小对比

路径大小(KiB)
./jp2kQ25720
./av1Q25Subsample2360
./av1Q252696
./heicQ25Subsample4440
./webpQ254440
./av1Q50Subsample8296
./av1Q509272
./jpegQ25Subsample12768
./jpegQ2516416
./jpegQ50Subsample22064
./av1Q75Subsample26488
./jpegQ5026816
./av1Q7529800
./heicQ50Subsample31128
./webpQ5031128
./jpegQ75Subsample38432
./jpegQ7545368
./jp2kQ5085640
./heicQ75Subsample102864
./webpQ75102864
./jp2kQ75151448
./jpegQ100Subsample156712
./av1Subsample181784
./gifQ100184344
./gifQ25184344
./gifQ50184344
./gifQ75184344
./heicQ100LosslessSubsample207040
./heicQ50LosslessSubsample207040
./webpLossless207040
./jpegQ100226944
./av1233280
./jp2kLossless301552
./png409976

质量对比

\(\to\)

\[ \text{PNG} > \text{AV1} \thickapprox \text{HEIC} > \text{WEBP} > \text{JPEG 2000} \thickapprox \text{JPEG} > \text{GIF} \]

众所周知,GIF 以愚蠢的 256 色和巨大的体积而闻名,怀揣着有损的心,却占着无损的大小。

编码时间对比

\(\to\)

\[ \text{AV1} > \text{HEIC} > \text{PNG} \thickapprox \text{WEBP} \thickapprox \text{GIF} ≈ \text{JPEG 2000} \thickapprox \text{JPEG} \]

除了 AV1 特别慢之外,其他都还算可接受范围。用固定时间换不断增长的流量。在长期来看,是高效的。

总结

有损压缩综合排序:\(\text{HEIC} > \text{WEBP} > \text{AV1} > \text{JPEG}\)

日常存储建议使用 HEIC,网络分发建议使用 WEBP

AV1 需要硬件进一步支持才能更好发挥。

是时候让 JPEG 滚出历史舞台了。(暴论)

comments powered by Disqus