资源简介
功能要求
1. 针对一幅BMP格式的图片文件,统计256种不同字节的重复次数,以每种字节重复次数作为权值,构造一颗有256个叶子节点的哈夫曼二叉树。
2. 利用上述哈夫曼树产生的哈夫曼编码对图片文件进行压缩。
3. 压缩后的文件与原图片文件同名,加上后缀.huf(保留原后缀),如pic.bmp
压缩后pic.bmp.huf
4. 解压缩
代码片段和文件信息
#include
#include
#include
#include
#include
#include “FILEio.h“
using namespace std;
int readFILE(HuffNode hufftree[] string InFile)
{
std::fstream infile;
unsigned char ch;
FILESTRUCT z[256] = { 0 };
for (int k = 0; k < 256; k++)//初始化
z[k].fileid = k;
infile.open(InFile); //打开文件
if (!infile)
{
std::cout << “ 打开文件失败 “ << std::endl;
}
while (infile.get((char&)ch))//获取文件信息
{
for (int g = 0; g < 256; g++)
{
if (ch == g) //统计字符频度
z[g].sum++;
}
}
for (int m = 0; m<256; m++)//冒泡排序
{
for (int n = m + 1; n <= 255; n++)
{
if (z[n].sum <= z[m].sum)//频度从小到大排序
{
int temp1 = z[n].sum;
z[n].sum = z[m].sum;
z[m].sum = temp1;
int temp2 = z[n].fileid;
z[n].fileid = z[m].fileid;
z[m].fileid = temp2;
}
}
}
for (int m = 0; m<256; m++)//冒泡排序
{
for (int n = m + 1; n <= 255; n++)
{
if (z[n].sum <= z[m].sum)//序号排序
{
int temp2 = z[n].fileid;
z[n].fileid = z[m].fileid;
z[m].fileid = temp2;
}
}
}
int d = 0;//有效字节
for (int j = 0; j < 256; j++)//去掉频度为0的字符
{
if (z[j].sum != 0)
{
hufftree[d].ch = z[j].fileid;
hufftree[d].weight = z[j].sum;
d++;
}
}
infile.close();//关闭文件
return d;//返回字符个数
}
int WriteFile(const char *pFilename const HEAD sHead const char *pBuffer const int nbuf)
{
// 生成文件名
char filename[BYTESIZE + 5] = { ‘\0‘ };
strcpy(filename pFilename);
strcat(filename “.huf“);
ofstream fout(filenameios::binary);
fout.write((char*)&sHead sizeof(HEAD));
fout.write(pBuffersizeof(char) * nbuf);
fout.close();
cout << “生成压缩文件:“ << filename << endl;
int len = sizeof(HEAD) + strlen(pFilename) + 1 + nbuf;
cout << “压缩文件大小为:“ << len << “B“ << endl;
double rate = len * 1.0 / sHead.length;
cout.setf(ios::fixed);
cout << “压缩率为:“ << setprecision(4) << rate << “%“ << endl;
return len;
}
char Str2Byte(const char * pBinStr)//将字符串转化为字节
{
char b = 0x00;
for (int i = 0; i < 8; i++)
{
b = b << 1;// 左移1位
if (pBinStr[i] == ‘1‘) {
b = b | 0x01;
}
}
return b;
}
int Encode(const char * FileAdr const HuffmanCode HC char *pBuffer const int nbuf)
{
char cd[BYTESIZE] = { ‘\0‘ }; char d0[BYTESIZE] = { ‘\0‘ };
// 开辟缓冲区
pBuffer = (char *)malloc(nbuf * sizeof(char));
FILE *fin = fopen(FileAdr “rb“);
if (!pBuffer)
{
cerr << “开辟缓冲区失败!“ << endl;
return ERROR;
}
char *pfag;
int pos = 0; // 缓冲区指针
int ch;
// 扫描文件,根据Huffman编码表对其进行压缩,压缩结果暂存到缓冲区中。
while ((ch = fgetc(fin)) != EOF)
{
strcat(cd HC[ch]); // 从pHC复制编码串到cd
// 压缩编码
while (strlen(cd) >= 8)
{
// 截取字符串左边的8个字符,编码成字节
pBuffer[pos++] = Str2Byte(cd);
// 字符串整体左移8字节
for (int i = 0; i < BYTESIZE - 8; i++)
{
cd[i] = cd[i + 8];
}
}
}
fclose(fin);
fin = NULL;
if (strlen(cd) > 0)
{
pBuffer[pos++] = Str2Byte(cd);
}
return OK;
}
int Compress(const
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2019-05-01 18:39 huffmanty\
目录 0 2019-05-01 11:16 huffmanty\Debug\
文件 124928 2019-05-01 17:49 huffmanty\Debug\huffmanty.exe
文件 881612 2019-05-01 17:49 huffmanty\Debug\huffmanty.ilk
文件 1044480 2019-05-01 17:49 huffmanty\Debug\huffmanty.pdb
文件 13934 2019-05-01 18:59 huffmanty\README.md
目录 0 2019-05-01 18:28 huffmanty\huffmanty\
文件 269 2019-05-01 17:03 huffmanty\huffmanty\1.huf
文件 42229 2018-04-16 16:40 huffmanty\huffmanty\1.png
文件 42229 2019-05-01 11:23 huffmanty\huffmanty\1.png.png
文件 1036918 2017-12-25 14:16 huffmanty\huffmanty\111.bmp
文件 147493 2019-05-01 11:24 huffmanty\huffmanty\111.huf
文件 1036918 2019-05-01 11:24 huffmanty\huffmanty\111.huf.bmp
文件 811689 2018-04-16 16:40 huffmanty\huffmanty\2.png
文件 10167 2019-04-29 19:52 huffmanty\huffmanty\3.png
文件 1244231 2019-05-01 18:26 huffmanty\huffmanty\4.huf
文件 1866866 2019-05-01 18:26 huffmanty\huffmanty\4.jpg
文件 1866866 2018-07-27 11:03 huffmanty\huffmanty\ChMkJlbKwv2IJp20ABx8cnbTMTQAALGwAK5g-MAHHyK648.jpg
目录 0 2019-05-01 17:49 huffmanty\huffmanty\Debug\
文件 280542 2019-05-01 17:49 huffmanty\huffmanty\Debug\FILEio.obj
文件 13988 2019-04-26 20:42 huffmanty\huffmanty\Debug\create_huffman.obj
文件 69426 2019-05-01 11:12 huffmanty\huffmanty\Debug\huffmantree.obj
文件 71529 2019-04-30 18:44 huffmanty\huffmanty\Debug\huffmantree.obj.enc
文件 237 2019-05-01 17:49 huffmanty\huffmanty\Debug\huffmanty.log
目录 0 2019-05-01 17:49 huffmanty\huffmanty\Debug\huffmanty.tlog\
文件 3122 2019-05-01 17:49 huffmanty\huffmanty\Debug\huffmanty.tlog\CL.command.1.tlog
文件 77016 2019-05-01 17:49 huffmanty\huffmanty\Debug\huffmanty.tlog\CL.read.1.tlog
文件 4504 2019-05-01 17:49 huffmanty\huffmanty\Debug\huffmanty.tlog\CL.write.1.tlog
文件 223 2019-05-01 17:49 huffmanty\huffmanty\Debug\huffmanty.tlog\huffmanty.lastbuildstate
文件 1492 2019-05-01 17:49 huffmanty\huffmanty\Debug\huffmanty.tlog\li
文件 4350 2019-05-01 17:49 huffmanty\huffmanty\Debug\huffmanty.tlog\li
............此处省略29个文件信息
相关资源
- 车辆保险管理系统
- 山东科技大学刘彤老师数据挖掘课程
- 单片机病房呼叫系统
- 课程设计题二:7人多数表决器.zip
- EDA课程设计-抢答器FPGA代码。quartus软
- 算法导论第三版英文原版
- ios课程设计
- CTP接口及开发文档.zip
- 网络安全课程设计_端口扫描器的设计
- VxWorks及Tornado集成开发环境的使用
- 电子技术课程设计报告.docx
- 小功率调频发射机的课程设计
- 软件工程课程设计饭卡管理系统
- 闭环调速控制系统
- 操作系统课程设计完整版报告+源程序
- 炫彩界面库帮助文档chm-v2.5.0
- vc实用教程第三版+郑阿奇
- 嵌入式华清远见培训 ARM代码内部资料
- STM32+lcd12864串行方式显示贪吃蛇代码
- VLD For VS2019
- 课程设计--超市商品管理系统.rar
- 开关电源课程设计小功率单端反激式
- 低频功率放大器电路图
- 电子系统课程设计\\基于FPGA的直接数
- 端口扫描程序代码课程设计
- 数电课程设计-数字时钟multisim
- web课设图书管理系统
- 网上鲜花销售系统完整代码
- Qt中嵌入Excel
- 基于51单片机的温度控制系统设计课程
评论
共有 条评论