# BMP赫夫曼编码 **Repository Path**: Morphlng/bmp-huffman-coding ## Basic Information - **Project Name**: BMP赫夫曼编码 - **Description**: 图像处理实验三,要求: 1. 编写函数,获得赫夫曼编码表 2. 根据赫夫曼编码,将像素数据用编码表示 3. 将编码后的图片数据写入文件 4. 读取压缩后的图像文件和赫夫曼编码表 5. 利用赫夫曼编码表还原图像文件 - **Primary Language**: C++ - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2021-01-10 - **Last Updated**: 2024-11-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BMP赫夫曼编码 #### 介绍 图像处理实验三,要求: 1. 编写函数,获得赫夫曼编码表 2. 根据赫夫曼编码,将像素数据用编码表示 3. 将编码后的图片数据写入文件 4. 读取压缩后的图像文件和赫夫曼编码表 5. 利用赫夫曼编码表还原图像文件 #### 代码说明 首先是编码部分 1. 赫夫曼编码 (完整定义包含于HuffmanTree.h) 2. 统计像素值出现概率 (pixel_count) 3. 计算压缩效率 (calculate_bpp) 4. 将赫夫曼编码表以文本格式写入文件 (writeHuffmanTable) 5. 将图像头部,即信息头、文件头、调色板,以二进制写入文件 (writeHeader) 6. 将图像编码后的数据以二进制写入文件 (writeBit) 7. 以正确顺序调用1-7函数,完成bmp图像的赫夫曼编码 (**ImageCompression**) 以下是解码部分 1. 从文件读入一个HuffmanCodeTable (readHuffmanTable) 2. 从编码文件中读取bmp头部信息 (readHeader) 3. 将一个字节按位输出,用于读取编码数据 (Byte2Binary) 4. 读取编码数据 (readEncodeData) 5. 按照赫夫曼编码表解码编码数据 (decode) 6. 以正确顺序调用8-12函数,完成bmp图像的解码 (**ImageDecode**) 我又增加了一种解码方式,通过码表逆向构建赫夫曼树,然后利用赫夫曼树还原的方法,效率比上面的高很多 1. ```typedef struct BiTNode``` 二叉树定义,我们逆向构建时用链式二叉树,不再使用数组二叉树 2. 根据码表,还原赫夫曼树 (restore_HuffmanTree) 3. 利用赫夫曼树解码 (decode_BiTree) 4. 以正确顺序调用2-3函数,完成bmp图像的快速解码 (**ImageDecode_fast**) #### 运行结果 赫夫曼编码执行后会产生多个文件,encode_Image.bmp是压缩图像数据,HuffmanCodeTable.txt是赫夫曼编码表,predict.bmp和Depredict.bmp分别是压缩过程中预测优化图像,和最终解码图像。 #### 说明 1. 由于该项目较为复杂,我直接给出了项目文件,方便大家缕清文件关系 2. 使用动态库时发生了一些未知错误,因此本项目中以hxlbmpfile.cpp直接给出 3. 如果你运行出现错误,检查一下代码中的文件路径,我规定为`./output/xxx`,你可以修改为绝对路径来避免出错。 4. 如果你对代码有一些疑惑,可以先看一下[我的博客](https://blog.csdn.net/weixin_44151650/article/details/106098798),也许会有帮助