sk2400

JPEG压缩简介(2) (2006-04-28 22:07:32)

0
阅读(15992)

5、Huffman编码

  DC与AC的huffman编码表是不同的两个.

  JPEG位提高效率,不直接存储数值,而是将数值分成16组用于存储。分组规则是,正数时表示此正数的二进制码的长度是组号,二进制表示即使存储值,负数 时用来表示负数绝对值的的二进制码的长度是组号,存储值是 负数+2的n次幂-1。例如23表示是(5,10111),-30表示是(5,00001)。
  (1)DC编码
     DC是每组64个数据的第一个,代人DCT的公式中可看出DC值是一块样本的平均值,通常很大,连续块的DC值之间有很紧密的联系,因此使用连续块的DC 值的差别进行编码,例如前一块的DC值是78,本块的DC值是148,则本块中的DC编码是70。根据上面介绍的JPEG存储数值的方法应表示为 (7,1000110),组号7在Huffman编码表中的表示为是1111111(可查表得),所以DC编码输出到文件中的值是7 的huffman编码与1000110,既11111111000110。
  (2)AC编码
     在64个数据中除了DC其它的都是AC。AC编码输出在DC编码之后。编码过程是将括号中的后一个数转换成JPEG的数值存储形式,再将组号用4位二进制 表示与括号中前一个数值的4位二进制表示连接成一个8位二进制数,在Huffman表中查得结果与括号中后一个数的二进制表示方式相连输出到文件中例如在 的4步中已经得到了一串序列(0,57);(0,45);(4,23);(1,-30);(0,-8);(2,1);(0,0),57对应的存储形式是 (6,111001),45->(6,101101),23->(5,10111),-30->(5,00001),-8-> (4,0111),1->(1,1).所以序列写成 0,6,111001;0,6,101101;4,5,10111;1,5,00001;0,4,0111;2,1,1;0,0.
每组前两个数联合编码写成6,111001;6,101101;69,10111;21,00001;4,0111;33,1;0,0
6的Huffman编码是111000,依次查表可得,则写入文件的数据是111000 111001 111000 101101......
  
   每一个8*8的数据块都如此处理,将图像的数据部分写入文件中,JPEG文件的前面还用一部分信息头,表识文件的信息...(待续)