程序的流程:读取输入文件——>统计0-255出现的个数,计算概率——>排序,进行huffman编码——>输出编码后的文件。
输入文件的形式:
若命令参数为空,程序会自动创建一个临时文件。
调用value函数统计文件中256个样值(0-255)的出现次数,将数据存储在values数组,再计算概率,将数据存储在prob数组。
调用sort函数,按照概率大小对样值进行排序后调用huff函数完成huffman编码。
huff函数中会调用create_code函数,create_code函数会判断当前节点是否为树叶节点,若不是则写入下一个节点,左0右1进行赋值。当左右节点都不存在即为树叶节点时,记录码字和长度。
huff函数还需要调用create_list函数。create_list函数先按概率从大到小排出概率链,tail和tail->back(概率最小的两个节点)作为初始节点,将两者概率相加,生成新的父节点,父节点进入概率链重新开始排序。重复以上工作,直到最终的父节点,该点的码字为0.
完成huffman编码后将256个样值的码字和长度写入输出文件。
测试图像:
640*480,YUV420P,大小为450KB。
huffman编码后的输出文件(部分):
输出文件大小为386KB。
可以看出,huffman编码对文件有一定的压缩效果,但是压缩比不高,有些情况甚至比编码前的文件更大。所以只靠huffman编码来提高压缩率是不可行的,需要结合其它编码方式使用。