图片压缩原理简介
概述
图像压缩的目标是用更少的比特表示视觉信息,保留尽可能多的“感知”细节。压缩方法大致分为两类:无损(可完全还原原始像素)和有损(允许信息丢失以换取更高压缩比)。压缩通常包含三个阶段:变换(变基、去相关)、量化/编码(舍弃或缩减信息)、熵编码(无冗余表示)。
基础概念(核心术语)
- 去相关(Decorrelation): 消除像素间的统计相关性,便于后续压缩(例:DCT、Wavelet、色彩空间转换)。
- 量化(Quantization): 将连续或高精度系数映射到较少的离散值,是有损压缩的关键步骤。
- 熵编码(Entropy Coding): 用可变长度码(Huffman、算术编码、ANS)对符号按概率最优编码。
- 色彩子采样(Chroma Subsampling): 利用人眼对亮度敏感、对色度不敏感的特性,降低色度分辨率(例:4:4:4、4:2:2、4:2:0)。
- 感知指标: PSNR、SSIM 等衡量失真与视觉质量的指标。图片转圆形
有损 vs 无损(原理差异)
- 无损压缩: 目标是可逆变换与无损熵编码。典型步骤:预测(线性或上下/左/左上预测)、差分、再用通用无损算法(LZ77 + Huffman/动态Huffman)。优点:原样恢复;缺点:压缩率有限。
- 有损压缩: 在变换域进行量化(舍弃高频或低能量系数),然后熵编码。优点:更高压缩率;缺点:可能出现块效应、模糊、伪影等。最好的图片压缩网站
JPEG(基于块的 DCT 有损压缩)
- 总体流程: RGB → 色彩空间转换到 YCbCr → 色度子采样 → 将图像分成 8x8 块 → 对每块做 2D DCT → 除以量化矩阵并四舍五入 → Zig-Zag 顺序 + 运行长度编码(RLE)→ 熵编码(Huffman/算术)。
- 2D DCT 公式(8x8):
$$
C(u,v)=\frac{\alpha(u)\alpha(v)}{4}\sum_{x=0}{7}\sum_{y=0} f(x,y)\cos\frac{(2x+1)u\pi}{16}\cos\frac{(2y+1)v\pi}{16}
$$
其中 $\alpha(0)=\frac{1}{\sqrt{2}}$, $\alpha(k)=1$ for $k>0$。 - 量化: 对 DCT 系数除以量化矩阵并四舍五入,量化矩阵越大,丢失越多(质量越差)。
- 伪影来源: 块边界(块独立处理)、粗糙量化造成高频信息丢失(马赛克)、色度子采样造成边缘色偏。图片裁剪
- 变种: Baseline JPEG(Huffman)、Progressive JPEG(多次扫描先传低频再传高频)、Lossless JPEG(使用预测与Golomb编码,但不常用)。
PNG(无损,基于 DEFLATE)
- 总体流程: PNG 是基于扫描行的预测过滤 + DEFLATE(LZ77 + Huffman)。每行先尝试多个滤波器(None, Sub, Up, Average, Paeth),选择使行数据更易被 LZ77 找到重复模式的滤波器。
- 过滤器作用: 减少相邻像素之间的差值幅度,提高 LZ77 的重复匹配率。
- DEFLATE: LZ77 找到重复字符串并以 (距离, 长度) 表示,然后对字面量和长度/距离符号做 Huffman 编码。
- 额外特性: 支持透明通道(RGBA)、可选的 Adam7 交错(七次扫描)用于渐进显示。
- 适用场景: 图表、文字、含透明度的图像或需要严格无损的场景。
GIF(限色 + LZW)
- 总体流程: 限制调色板(最多 256 色),对像素索引做 LZW 压缩。适合色块、动画,但色深限制和专利历史限制了应用。
- 用途: 简单动画、低色深图像。
SVG(矢量图,文本/XML)
- 本质区别: SVG 描述的是几何形状、路径和样式,而不是像素;缩放不失真。存储是文本(XML),通常通过 gzip 压缩(产生 .svgz)。
- 优化点: 简化路径(减少控制点)、合并/去除冗余属性、删除注释/空白、压缩字体、使用相对命令、合并形状为路径等。
- 与栅格图混用: 大型复杂位图不适合转换为矢量;SVG 可嵌入位图 PNG/JPEG。
现代格式:WebP / AVIF / HEIF
- WebP: Google 推出,支持有损(基于 VP8 的变换)与无损(基于预测 + Huffman)的混合,兼具透明度支持,压缩优于 JPEG/PNG 在同等质量下通常文件更小。
- AVIF/HEIF(基于视频编码): 使用 AV1/HEVC 的工具链,采用更先进的变换(更高效的预测、变换、上下文建模与算术编码),在相同感知质量下通常比 JPEG/WebP 更高效,但编码复杂且解码成本更高。
熵与信息理论(关键公式)
- 香农熵:
$$
H = -\sum_i p_i \log_2 p_i
$$
熵给出理论上的无冗余编码下每个符号的最小平均比特数。 - PSNR 与 MSE:
$$
MSE = \frac{1}{NM}\sum_{x=0}{N-1}\sum_{y=0}(I(x,y)-K(x,y))^2
$$
$$
PSNR = 10\log_{10}\left(\frac{MAX_I^2}{MSE}\right)
$$
PSNR 越高,重建越接近原图,但 PSNR 并不总与视觉主观质量一致(故引入 SSIM)。
感知质量指标
- SSIM(结构相似性):考虑亮度、对比度与结构,和人眼主观感受更相关。
- MS-SSIM、VMAF: 更复杂、用于视频/图像的感知质量评估。
常见压缩伪影与成因
- 块效应(blocking): 块独立处理(JPEG)的边缘失真。
- 环状伪影(ringing): 变换后的频域截断(量化)产生振铃。
- 带状与色彩带(banding): 颜色量化过粗或色域受限。
- 模糊(blurring): 高频信息被大量丢弃。
实用建议(选择与优化)
- 照片: 优先使用 JPEG(有损)或 AVIF/WebP(更好压缩);对网页使用 WebP/AVIF 可显著减小体积。
- 图标/简单图形/含透明的图像: 使用 PNG(无损)或 SVG(矢量更佳);尝试 PNG 的滤波器+zopfli 等工具优化。
- 需要透明且高压缩: WebP 无损或有损支持透明(优势明显)。
- 保真度要求高: 用无损 PNG 或 TIFF;若要存档照片用无损格式(例如 PNG 或专门的 RAW)。
- 处理流程: 先在高精度下进行预处理(降噪、色彩空间校正、裁剪),再压缩。对 JPEG 可调整量化表和使用 4:2:0 子采样与渐进扫描。
- 工具推荐:
mozjpeg/cjpeg(更好 JPEG)、zopfli(更强的 DEFLATE)、pngcrush/optipng/zopflipng(PNG 优化)、cwebp/avifenc(WebP/AVIF 转换)、svgo(SVG 优化)。
总结(要点回顾)
- 无损靠预测/差分 + LZ/Huffman;有损靠变换(如 DCT/Wavelet)+ 量化 + 熵编码。
- JPEG 的核心是 8x8 DCT + 量化 + 熵编码;PNG 的核心是行滤波 + DEFLATE;SVG 是矢量文本,可用 gzip 极大减小。
- 新格式(WebP/AVIF)利用视频编码技术,在同等视觉质量下通常更高效,但兼容性与编码复杂度是考量因素。
- 最佳实践是基于图像类型与应用场景选择格式,并用专门工具与合适参数做二次优化,同时用 SSIM/VMAF 等感知指标评估质量。
如果你想,我可以:
- 针对某一格式给出更详细的编码流程图或伪代码;或
- 演示用命令行工具对一张图片做对比压缩与质量测量(需要你提供一张图片或允许我给出示例命令)。你想先看哪一个?
浙公网安备 33010602011771号