哈夫曼编码原理:设256种颜色在图片中各出现了a1、a2、…、an次,于是可以得到一个对应的权重数组。将权重数组以以下范例形式建立哈夫曼树。
范例:假设一个含有6个数值的权重数组9、8、3、6、7、1:
1. 首先选出两个最小的权值1、3。建立一颗二叉树:(注意小数在左)
2. 将1、3合并为4,加入原权重数组,即此时权重数组为:9、8、6、7、4
3. 再选出两个最小权值4、6,此时二叉树为:
4.依照上述方法,直到最后建立一颗哈夫曼树:(即每次从权重集合找出两个最小的数值,合并后再加入权重数组。并且同时建立二叉树,直到权重数组只剩下所有数值之和。)
建立颜色数组的哈夫曼树之后,从根节点进行遍历,做字数编码加0,右子树编码加1。(例如范例中7的哈夫曼编码为000,1的哈夫曼编码为1100)此处为变长编码。遍历整棵哈夫曼树之后即可得到256种颜色的哈夫曼编码。读取256灰度的bmp图片对映即可进行压缩。
代码部分:
类中构造器的参数为bmp解码部分,因与本讲述无关故不上传
Compression.h
#pragma once
#include "BMPbase.h"
#include <iostream>
using namespace std;
struct HuffmanTree {
HuffmanTree* parent;//parent节点
HuffmanTree* LTree;//左节点,即为1节点 应为变短编码
HuffmanTree* RTree;//右节点,即为0节点 遵循左清右重原则
int TreeIndex;//树的下标
bool isSorted;//判断是否被选取
int weight;//本节点的权值
int index;//本节点的原编码数位
};
class Compression
{
public:
Compression(BMPbase* pic, int size);
~Compression();
void BuildHuffmanTree(int min1,int min2);
void showTree(HuffmanTree * root, string str);
string* getHuffmanCode();
void choseMin(int & min);
private:
int* weightArray;
int size;//图色数
HuffmanTree** TreeArray;
int SortPoint;//排序静态指针
//int unUsed;//未被用到的颜色数
string* huffmanCode;//生成的哈夫曼编码
HuffmanTree* root;//根节点
};
Compression.cpp
#include "stdafx.h"
#include "Compression.h"
Compression::Compression(BMPbase* pic, int size)
{
this->size = size;
weigh
范例:假设一个含有6个数值的权重数组9、8、3、6、7、1:
1. 首先选出两个最小的权值1、3。建立一颗二叉树:(注意小数在左)
2. 将1、3合并为4,加入原权重数组,即此时权重数组为:9、8、6、7、4
3. 再选出两个最小权值4、6,此时二叉树为:
4.依照上述方法,直到最后建立一颗哈夫曼树:(即每次从权重集合找出两个最小的数值,合并后再加入权重数组。并且同时建立二叉树,直到权重数组只剩下所有数值之和。)
建立颜色数组的哈夫曼树之后,从根节点进行遍历,做字数编码加0,右子树编码加1。(例如范例中7的哈夫曼编码为000,1的哈夫曼编码为1100)此处为变长编码。遍历整棵哈夫曼树之后即可得到256种颜色的哈夫曼编码。读取256灰度的bmp图片对映即可进行压缩。
代码部分:
类中构造器的参数为bmp解码部分,因与本讲述无关故不上传
Compression.h
#pragma once
#include "BMPbase.h"
#include <iostream>
using namespace std;
struct HuffmanTree {
HuffmanTree* parent;//parent节点
HuffmanTree* LTree;//左节点,即为1节点 应为变短编码
HuffmanTree* RTree;//右节点,即为0节点 遵循左清右重原则
int TreeIndex;//树的下标
bool isSorted;//判断是否被选取
int weight;//本节点的权值
int index;//本节点的原编码数位
};
class Compression
{
public:
Compression(BMPbase* pic, int size);
~Compression();
void BuildHuffmanTree(int min1,int min2);
void showTree(HuffmanTree * root, string str);
string* getHuffmanCode();
void choseMin(int & min);
private:
int* weightArray;
int size;//图色数
HuffmanTree** TreeArray;
int SortPoint;//排序静态指针
//int unUsed;//未被用到的颜色数
string* huffmanCode;//生成的哈夫曼编码
HuffmanTree* root;//根节点
};
Compression.cpp
#include "stdafx.h"
#include "Compression.h"
Compression::Compression(BMPbase* pic, int size)
{
this->size = size;
weigh