所谓有损压缩,即不保留原样,刻意丢失图像信息,以达到压缩目的。
有损压缩所需考虑的,是如何丢失为「佳」。
常见有损压缩格式
似乎没什么必要自己再写一遍,自行参照 Wikipedia: 图形文件格式比较
压缩测试
压缩脚本与测试图像下载,仅供学习交流使用,本人无图像版权。
使用 vips
命令行工具压缩。
本次测试的算法有:
PNG
(输入)JPEG
JPEG 2000
GIF
WEBP
HEIF
AV1
均以极限 CPU Effort 测试,能够 YUV420
重采样的,测试了该项。其中
WEBP
、HEIC
、AV1
,libvips
无法转码 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) |
---|---|
./jp2kQ25 | 720 |
./av1Q25Subsample | 2360 |
./av1Q25 | 2696 |
./heicQ25Subsample | 4440 |
./webpQ25 | 4440 |
./av1Q50Subsample | 8296 |
./av1Q50 | 9272 |
./jpegQ25Subsample | 12768 |
./jpegQ25 | 16416 |
./jpegQ50Subsample | 22064 |
./av1Q75Subsample | 26488 |
./jpegQ50 | 26816 |
./av1Q75 | 29800 |
./heicQ50Subsample | 31128 |
./webpQ50 | 31128 |
./jpegQ75Subsample | 38432 |
./jpegQ75 | 45368 |
./jp2kQ50 | 85640 |
./heicQ75Subsample | 102864 |
./webpQ75 | 102864 |
./jp2kQ75 | 151448 |
./jpegQ100Subsample | 156712 |
./av1Subsample | 181784 |
./gifQ100 | 184344 |
./gifQ25 | 184344 |
./gifQ50 | 184344 |
./gifQ75 | 184344 |
./heicQ100LosslessSubsample | 207040 |
./heicQ50LosslessSubsample | 207040 |
./webpLossless | 207040 |
./jpegQ100 | 226944 |
./av1 | 233280 |
./jp2kLossless | 301552 |
./png | 409976 |
质量对比
高 \(\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
滚出历史舞台了。(暴论)