
本文共 1577 字,大约阅读时间需要 5 分钟。
JPEG 基础知识与编码实现
JPEG 基础知识
JPEG(Joint Photographic Experts Group,联合图像专家小组)是一种广泛使用的图片文件格式标准。它基于有损压缩算法,能够有效减小图片文件的大小,同时保持较高的视觉质量。JPEG文件的常见扩展名包括 .jpg、.JPEG、.jpe、.jfif 和 .jif。
JPEG 编码原理
色彩空间转换
JPEG的编码过程首先将图像从 RGB 色彩空间转换为 Y’CbCr 色彩空间。Y’ 表示亮度分量,Cb 和 Cr 分别表示蓝色和红色的色差值。这种转换减少了色彩信息的量,使压缩过程更加高效。
下采样
由于人眼对亮度(Y’)的变化比色差值(Cb 和 Cr)更敏感,JPEG采用下采样技术对色差分量进行降低分辨率处理。常见的下采样率包括:
- 4:4:4:无下采样(默认)
- 4:2:2:水平方向下采样一倍
- 4:2:0:水平和垂直方向都下采样一倍
块分割
下采样后,图像被分割为 8x8 像素块,称为最小编码单位(MCU)。根据下采样率,MCU的大小会不同:
- 4:4:4:8x8
- 4:2:2:16x8
- 4:2:0:16x16
离散余弦变换
JPEG采用离散余弦变换(DCT)将图像信号转换为频域表示。这种变换能够有效减少高频分量的信息量。
量化
量化是压缩过程中的关键步骤。DCT后,图像数据按频率分层,量化矩阵将每个频率分量转换为离散值(有损压缩)。这个过程是不可逆的。
JPEG 压缩效果
图片质量 | 文件大小(bytes) | 压缩比例 | 质量差异 |
---|---|---|---|
100 | 81447 | 2.7:1 | |
50 | 14679 | 15:1 | |
25 | 9407 | 23:1 | |
10 | 4787 | 46:1 | |
1 | 1523 | 144:1 |
从表中可以看出,压缩质量越低,文件大小越小,压缩比例越高。然而,压缩质量的降低会导致图像质量下降。
JPEG 编码实现
选用编解码库
Android 系统自带了 Skia 引擎下的 JPEG 解码器和编码器。libjpeg-turbo 是一个高效的 JPEG 编码库,支持优化编码参数。
Android 图像解码
在 Android 中,解码过程主要通过 BitmapFactory 进行。解码后的图像会被转换为 Bitmap 对象,支持多种像素配置,如:
- ALPHA_8(透明度)
- ARGB_4444
- ARGB_8888(默认)
- HARDWARE(使用 Native 内存)
- RGBA_F16
- RGB_565(只存储 RGB 通道)
Android JPEG 压缩
压缩参数设置
- 图像尺寸:原始尺寸 vs 缩放尺寸
- 颜色类型:常用 JCS_EXT_BGRA 或 JCS_RGB
- 下采样率:4:4:4、4:2:2 或 4:2:0
- 霍夫曼编码表优化:默认为 TRUE,提升压缩效率
- 压缩质量:0-100,质量越低压缩率越高
压缩实现
通过调用 Bitmap.compress 方法进行压缩,支持 JPEG、PNG 和 WebP 格式。
采样算法
Android 支持两种采样算法:
此外,还有双立方采样(Bicubic)和 Lanczos 算法,能够提供更高质量的图像。
基准测试
通过基准测试可以比较不同压缩工具和采样算法的效果。mozjpeg 和 jpeg-turbo 是常用工具,Spectrum 库则提供更好的压缩率和质量。
结论
JPEG 是移动设备上广泛使用的图像格式,了解其编码原理和优化方法,对于开发高效图像应用至关重要。通过合理设置压缩参数和采样算法,可以在保证图像质量的同时,最大化压缩效率。
发表评论
最新留言
关于作者
