1. 图像分割
将图像矩阵分割成一块块8X8单位,每个单位单独用后面4个步骤处理,使用8X8尺寸进行分割的原因是:图像本身的连贯性,一个8X8的图像中的数值一般不会出现大的跳跃。
2. 颜色模式从RGB转成YCbCr
RBG模式大家都懂,YCbCr的意思是(Y-亮度,Cb-蓝色差,Cr-红色差),在黑白电视里,只用Y亮度数据就呈现除了视觉效果,后来加上了CbCr就成了彩色电视,由于人对亮度最敏感,所以在压缩的时候Y值的保留率需要比CbCr高,这样可以尽量小的影响人感官体验,也是转成YCbCr的原因。算法详情入口
3. 离散余弦变换(DCT)
DCT是一个很厉害的算法,可以把一个数组数据转换成一个矩阵,且数据都集中到坐上角,其余都会接近为0,最重要的是这算法是可逆的。算法详情入口
4. 数据量化
什么是量化?举个例子,游戏人物可以面朝着360转,用浮点数表示0~2π,但其实是没必要的,我们可以把方向定为16个,这样既不影响用户体验,数据量也大大减小。
JPEG数据量化呢,会有个量化系数矩阵,用上一步DCT转化得来的图像矩阵除以量化系数矩阵,得到新的矩阵,然后用round函数四舍五入处理矩阵后,一大部分数据变成0,实现数据量化压缩。算法详情入口
Huffman编码
最最后,把矩阵数据转化成一维数组,然后用最最常用的Huffman编码压缩下,得到了最终JPEG压缩的图像数据。算法详情入口
大家知道世界上第一张JPEG图片是什么吗?当当当 Lenna 原图。