Android JPEG 压缩那些事
发布日期:2021-05-14 03:18:18 浏览次数:20 分类:精选文章

本文共 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 支持两种采样算法:

  • 邻近采样(Nearest Neighbor):每个像素取其周围最近的像素值,处理速度快但图像质量较差。
  • 双线性采样(Bilinear):每个像素取周围 2x2 像素的加权平均,图像质量更好。
  • 此外,还有双立方采样(Bicubic)和 Lanczos 算法,能够提供更高质量的图像。


    基准测试

    通过基准测试可以比较不同压缩工具和采样算法的效果。mozjpeg 和 jpeg-turbo 是常用工具,Spectrum 库则提供更好的压缩率和质量。


    结论

    JPEG 是移动设备上广泛使用的图像格式,了解其编码原理和优化方法,对于开发高效图像应用至关重要。通过合理设置压缩参数和采样算法,可以在保证图像质量的同时,最大化压缩效率。

    上一篇:【Android设计模式应用】 谈谈Android中的单例模式
    下一篇:为吉林注入数字活力 华为要在东北亚博览会上展示哪些看家本领

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年05月05日 13时34分12秒