一.JPEG文件格式分析:
1.描述:
JPEG(Joint Photographic Experts Group)是JPEG标准的产物,该标准由国际标准化组织(ISO)制订,是面向连续色调静止图像的一种压缩标准。JPEG格式是最常用的图像文件格式,后缀名为.jpg或.jpeg。
2.文件格式
JPEG文件以segment的形式组织,其中每个segment以一个marker开始(marker均以0xFF+一个marker的标识符),随后为2字节的marker长度(不包含marker的起始两字节)和对应的payload(SOI和EOI marker只有2字节的标识符)。
注意,连续的0xFF字节并不是marker的起始标志,而是用来填充的特殊字符。
此外,部分中,0xFF后若为0x00,则跳过此字节不予处理。
二.JPEG的编解码
1.JPEG的编码:
编码原理:
其步骤如下:
(1)零偏置:对于灰度级为2^n 的像素,通过减去2^(n-1),将无符号整数变为有符号数,即值域变为正负对称。将绝对值大的数出现的概率大大减小,提高编码效率。
(2)DCT变换:先将图像分为8×8的像块,如果图像的宽(高)不是8的整数倍,使用图像边缘像素填充,以不改变频谱分布。实现能量集中和去相关,降低空间冗余度。
(3)量化:利用人眼视觉特性设计而成的矩阵量化DCT系数,减小视觉冗余。因为人眼对亮度信号比色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值;根据人眼对低频敏感,对高频不太敏感,对低频分量采取较细的量化,对高频分量采取较粗的量化。
JPEG标准中采用中平型均匀量化,输入DCT系数,输出量化系数。
(4)DC系数差分编码
8×8像块经过DCT后得到的DC系数有两个特点:
一是系数的值较大;
二是相邻像块的DC系数存在相关性(即存在冗余)。
根据这个特点,JPEG标准采用了DPCM(差分脉冲编码调制),以对相邻图像块之间量化DC系数的差值DIFF进行编码:
(5)AC系数之字形扫描
由于经DCT变换后,系数大多数集中在左上角,即低频分量区,因此采用Z字形按频率的高低顺序读出,可以出现很多连零的机会。可以使用游程编码。尤其在最后,如果都是零,给出 EOB (End of Block)即可。
(6)AC系数游程编码
当遇到很多连续的0时,为缩短数据长度,编码非零系数level和它之前0的个数run,(Run,level)。
如:0,0,3,0,2,0,0,0,1–>游程编码:(2,3),(2,2),(3,1)
(6)Huffman编码
对DC系数DPCM的结果和AC系数RLE的结果进行Huffman编码。
2.JPGE的解码
- 解码Huffman数据
- 解码DC差值
- 重构量化后的系数
- DCT逆变换
- 丢弃填充的行/列
- 反0偏置
- 对丢失的CbCr分量插值
- 将YCbCr通道数据变为RGB通道数据
三.程序设计
main函数:从命令行参数中接受输入输出文件名称,打开TRACEFILE,选择输出的文件格式
int main(int argc, char *argv[])
{
int output_format = TINYJPEG_FMT_YUV420P;
char *output_filename, *input_filename;
clock_t start_time, finish_time;
unsigned int duration;