• 大小: 5.36MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-09-25
  • 语言: 其他
  • 标签: 哈弗曼  

资源简介

编译环境vs,功能如题目所述对Bmp图像进行哈弗曼编码和解码

资源截图

代码片段和文件信息

// 霍夫曼压缩BMP文件.cpp : 定义控制台应用程序的入口点。
//

#include “stdafx.h“


#include 
#include 
#include 
#include “HuffmanCode.h“

using  namespace std;

#define BUF_LEN 4096

void ShowHelp()
{
cout << “编码命令:c  “ << endl;
cout << “解码命令:d  “ << endl;
cout << “对于编码的output file和解码的input file可以省略后缀,则默认采用.hfm。“ << endl;
}

// 将buf中01串循环转换为字符写入文件,rBegin开始位置,end结束位置,len缓冲区长度
void WriteToFile(FILE *file char *buf int &rBegin int end int len)
{
int d = end - rBegin; // 差距
if (d < 0)
{
d += len; // end在begin之前,循环到前面位置了
}
d = d / 8 * 8; // 本次总共需要读入的数据,每八位组成一个字节
if (d <= 0)
{
return;
}
unsigned char *wBuf = new unsigned char[d / 8];
memset(wBuf 0 d / 8);
int c = 0; // 当前已经读入的
unsigned char mark = 0x80;
while (c < d)
{
if (0 == (c % 8))
{
mark = 0x80;
}
if (‘1‘ == buf[rBegin])
{
wBuf[c / 8] |= mark;
}
mark >>= 1;
c++;
rBegin++;
if (rBegin >= len)
{
rBegin = 0;
}
}
fwrite(wBuf sizeof(char) d / 8 file);
}

// 将n以01串的形式写入buf中
void WriteByte(unsigned char n char* buf int &rBegin int len)
{
unsigned char m = 0x80;
while (m > 0)
{
if (0 == (n & m))
{
buf[rBegin] = ‘0‘;
}
else
{
buf[rBegin] = ‘1‘;
}
rBegin++;
if (rBegin >= len)
{
rBegin = 0;
}
m = m >> 1;
}
}

// 编码
void Code(char* input char* output)
{
FILE *file = fopen(input “rb“);
if (NULL == file)
{
cout << “无法打开文件:“ << input << endl;
return;
}
FILE *outFile = fopen(output “wb“);
if (NULL == outFile)
{
cout << “无法打开文件:“ << outFile << endl;
fclose(file);
return;
}
CHuffmanCode hfm;
unsigned char b[1024]; // 读文件缓冲区
unsigned long fileLen = 0; // 文件大小
int i;
// 直接读入文件,统计字节信息。
// 也可以只读图像内容,但解码还原时,如果是非24位位图还需要记录调色板信息,不如直接处理文件。
int len = fread(b sizeof(char) 1024 file);
while (len > 0)
{
fileLen += len;
for (i = 0; i < len; i++)
{
hfm.Add(b[i]);
}
len = fread(b sizeof(char) 1024 file);
}
// 读入完成,开始编码
hfm.CreateCode();

char buf[BUF_LEN]; // 缓冲区
int wBegin = 0; // 写入开始位置
int rBegin = 0; // 读取开始位置
// 生成新文件,文件格式为:4字节文件头4字节原文件长度+不定长编码表(256个[1字节[编码长度-1]+编码])+内容
buf[0] = ‘H‘;
buf[1] = ‘F‘;
buf[2] = ‘M‘;
buf[3] = ‘ ‘;
// 写入文件头
fwrite(buf sizeof(char) 4 outFile);
// 写入长度
fwrite(&fileLen sizeof(long) 1 outFile);
// 写入编码表
for (i = 0; i < 256; i++)
{
WriteByte((unsigned char)(hfm.GetCodeLen(i) - 1) buf wBegin BUF_LEN); // 将编码长度-1写入缓冲(长度范围在1-256之间)
hfm.AppendCode(i buf wBegin BUF_LEN); // 将编码写入缓冲
WriteToFile(outFile buf rBegin wBegin BUF_LEN); // 将缓冲写入文件
}
fseek(file 0 SEEK_SET); // 移动到头从新开始读
char back[] = { 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 0 };
int fileRead = 0;
int oldBfb = -1; // 上次百分比
do{
len = fread(b sizeof(char) 1024 file);
for (i = 0; i < len; i++)
{
hfm.AppendCode(b[i] buf wBegin BUF_LEN); // 将编码写入缓冲
WriteToFile(outFile buf rBegin wBegin BUF_LEN); // 将缓冲写入文件
}
fileRead += len;
if (oldBfb != ((fileRea

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2014-05-21 18:28  Bmp编码和解码\
     目录           0  2014-05-21 18:27  Bmp编码和解码\Bmp编码和解码\
     文件     6574080  2014-05-21 18:28  Bmp编码和解码\Bmp编码和解码.sdf
     文件         921  2014-05-21 17:59  Bmp编码和解码\Bmp编码和解码.sln
     文件       14848  2014-05-21 18:28  Bmp编码和解码\Bmp编码和解码.suo
     文件        6454  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Bmp编码和解码.cpp
     文件        4488  2014-05-21 18:10  Bmp编码和解码\Bmp编码和解码\Bmp编码和解码.vcxproj
     文件        1241  2014-05-21 18:02  Bmp编码和解码\Bmp编码和解码\Bmp编码和解码.vcxproj.filters
     文件         143  2014-05-21 17:59  Bmp编码和解码\Bmp编码和解码\Bmp编码和解码.vcxproj.user
     目录           0  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\
     文件         406  2014-05-21 18:10  Bmp编码和解码\Bmp编码和解码\Debug\Bmp编码和解码.exe.embed.manifest
     文件         472  2014-05-21 18:10  Bmp编码和解码\Bmp编码和解码\Debug\Bmp编码和解码.exe.embed.manifest.res
     文件         381  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\Bmp编码和解码.exe.intermediate.manifest
     文件          65  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\Bmp编码和解码.lastbuildstate
     文件        5532  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\Bmp编码和解码.log
     文件       95263  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\Bmp编码和解码.obj
     文件         206  2014-05-21 18:10  Bmp编码和解码\Bmp编码和解码\Debug\Bmp编码和解码_manifest.rc
     文件        1310  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\cl.command.1.tlog
     文件       11568  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\CL.read.1.tlog
     文件         990  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\CL.write.1.tlog
     文件       21728  2014-05-21 18:10  Bmp编码和解码\Bmp编码和解码\Debug\HuffmanCode.obj
     文件           2  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\link-cvtres.read.1.tlog
     文件           2  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\link-cvtres.write.1.tlog
     文件           2  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\link.1984-cvtres.read.1.tlog
     文件           2  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\link.1984-cvtres.write.1.tlog
     文件           2  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\link.1984.read.1.tlog
     文件           2  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\link.1984.write.1.tlog
     文件           2  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\link.5260-cvtres.read.1.tlog
     文件           2  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\link.5260-cvtres.write.1.tlog
     文件           2  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\link.5260.read.1.tlog
     文件           2  2014-05-21 18:24  Bmp编码和解码\Bmp编码和解码\Debug\link.5260.write.1.tlog
............此处省略27个文件信息

评论

共有 条评论