量化表
在JPEG压缩中有一个影响图像质量和压缩图像文件大小的系数,那就是“品质”,取值范围在0~100之间,标准量化表根据这个系数生成文件的量化表,再由文件量化表生成一个8*8空间的频率变化表,使左上角形成低频区,右下角形成高频区,然后用用排列后的64个数值乘以相应的频率,这样,64个数值中后面排在后面的数就会大量的变成0。而这些0在后面的将被压缩,JPEG的真正意义上的压缩就是从这里开始的。
经过DCT变换后就要进行量化,JPEG提供了标准的量化表,有很多量化的方法, 我只采用较简单的 变换后矩阵/量化矩阵 也就是对应位除,得到的数取整。一般量化后会得到很多的0。可能那些就是低频区吧。
在这64个数值(0~63)中,由于0处在最低频处,在乘以频率后值的消耗最小,我们把这个值看成是所有64个数值的平均值,称它为DC,也就是直流电平(电流);其余的63个量化后的数值,称它们为AC,也就是交流电平。DC是很重要的,是对那8*8图像的评估。因此对DC系数进行编码与AC时不同 的,因为我做的只考虑了一个矩阵,所有没有对DC系数进行编码。对DC系数采用差分编码。对AC时进行行程编码。
直流系数的编码
8×8图像块经过DCT变换之后得到的DC直流系数有两个特点,一是系数的数值比较大,二是相邻8×8图像块的DC系数值变化不大。根据这个特点,JPEG算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值(Delta)进行编码。
Delta=DC(0,0)k-DC(0,0)k-1
行程编码
行程编码的意思是 假设有 10000300405050002
量化AC系数的特点是1×64矢量中包含有许多“0”系数,并且许多“0”是连续的,因此使用非常简单和直观的游程长度编码(RLE)对它们进行编码。
因为在网上找说有标准的AC哈弗曼表,也找到了该表,但是就是不知道怎么用。javax.imageio.plugins.jpeg.JPEGHuffmanTable;StdACChrominance对象就是 表示标准的哈弗曼表。只是只提供长度和值,没有提供具体的二进制序列。
后来自己弄了个,将能出现的值建立哈弗曼表。在后面的操作就是对这个表进行查找。