基于哈夫曼的图片压缩

更新时间:2024-01-16 11:27:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

#pragma once

#include #include #include using namespace std;

struct BitmapFileHeader { WORD bmpHeader;//文件头“BM”

DWORD fileSize;//文件大小,字节为单位 WORD reservedWord1;//文件保留字1 必为0 WORD reservedWord2;//文件保留字2 必为0 DWORD offSet;//位图数据起始位置 };

struct BitmapFileInfo {

DWORD bmpInfoSize;//即本结构所占的大小 为28 即4字节 LONG bmpWidth;//位图的宽度 LONG bmpHeight;//位图的高度

WORD bmpPlanes;//目标设备的级别(必须为1)

WORD bmpBitCount;//每个像素的尾数,必须为1(双色)4(16色) 8(256色)彩)

DWORD bmpCompression;//必为0(BI_RGB未压缩) 1(BI_RLEB) 2(BI_RLE4) DWORD bmpSizeImage;//位图的大小 单位为字节 LONG bmpXpelsPerMeter;//水平分辨率 每米像素数 LONG bmpYpelsPerMeter;//垂直分辨率

DWORD bmpColorUsed;//位图显示所需颜色数

DWORD bmpColorImportant;//重要的颜色数 若为0 则都重要 };

class BMPbase {

public:

BMPbase(const char* fileName); ~BMPbase(); private:

bool fileSuccess;//判断文件是否打开成功的标志 bool fileCompression;//判断文件是否被压缩 bool bmpFileflag;//判断是否为BMP文件 bool bmpBitRight;//判断文件位数是否正确 BitmapFileHeader bmpHeader;//bmp文件头 BitmapFileInfo BmpPic;//bmp文件基本信息 BYTE* picPix;//图片数据数组

public:

bool isReadFileSuccess(); bool isBmpFile();

(真 24BitmapFileHeader getBmpHedader();//获取文件头 BitmapFileInfo getBmpInfo();//获取信息结构体 bool isBmpBitRight();//获取位图是否正确

bool isFileCompression();//获取文件是否被压缩 BYTE* getPicPix();//获取颜色数组 int pixNum; };

BMPbase.cpp

#include \#include \

BMPbase::BMPbase(const char* fileName) {

fileSuccess = true;//初始化文件为成功打开 bmpFileflag = true;//初始化文件为BMP文件 bmpBitRight = true;//初始化文件位数为正确 fileCompression = true;//初始化文件为未压缩 ifstream picReader(fileName, ios::binary); if (!picReader) {

fileSuccess = false;//文件读取失败 } else {

picReader.read((char*)&bmpHeader.bmpHeader, sizeof(WORD)); if (bmpHeader.bmpHeader != 0x4D42) {

bmpFileflag = false;//文件读取失败,类型不一致 }

else//开始读取文件信息 {

picReader.read((char*)&bmpHeader.fileSize, sizeof(DWORD));//读文件大小 picReader.read((char*)&bmpHeader.reservedWord1, sizeof(WORD));//读取保留字 picReader.read((char*)&bmpHeader.reservedWord2, sizeof(WORD));//读取保留字

/*if (bmpHeader.reservedWord1 != 0x00 || bmpHeader.reservedWord2 != 0x00)//判断文件保留字是否正确 {

fileSuccess = false;//文件读取失败 }*/

picReader.read((char*)&bmpHeader.offSet, sizeof(DWORD));//读取偏移量 picReader.read((char*)&BmpPic.bmpInfoSize, sizeof(DWORD));

/*if (BmpPic.bmpInfoSize != 0x28)//判断文件信息长度是否正确 {

fileSuccess = false;//文件读取失败 }*/

picReader.read((char*)&BmpPic.bmpWidth, sizeof(DWORD));//获取宽度 picReader.read((char*)&BmpPic.bmpHeight, sizeof(DWORD));//获取高度

picReader.read((char*)&BmpPic.bmpPlanes, sizeof(WORD));//获取目标设备的级别 必须为1

/*if (BmpPic.bmpPlanes != 0x01)//判断设备级别是否正确 {

fileSuccess = false;//文件读取失败 }*/

picReader.read((char*)&BmpPic.bmpBitCount, sizeof(WORD));//获取每像素所需位数 8位图

if (BmpPic.bmpBitCount != 8)//判断是否为8位图 {

bmpBitRight = false;//文件读取失败,非8位图 }

picReader.read((char*)&BmpPic.bmpCompression, sizeof(DWORD));//获取文件压缩 if (BmpPic.bmpCompression != 0x00)//判断是否压缩 {

fileCompression = false;//文件读取失败,已被压缩 }

picReader.read((char*)&BmpPic.bmpSizeImage, sizeof(DWORD));//获取sizeImage picReader.read((char*)&BmpPic.bmpXpelsPerMeter, sizeof(DWORD));//获取文件水平分辨率

picReader.read((char*)&BmpPic.bmpYpelsPerMeter, sizeof(DWORD));//获取文件水平分辨率

picReader.read((char*)&BmpPic.bmpColorUsed, sizeof(DWORD));//获取文件用到颜色 picReader.read((char*)&BmpPic.bmpColorImportant, sizeof(DWORD));//获取文件重要颜色

picReader.seekg(bmpHeader.offSet, ios::beg);//从文件开头开始偏移前面读出的偏移量

pixNum = BmpPic.bmpHeight*BmpPic.bmpWidth; picPix = new BYTE[pixNum];

for (int x = 0; x < pixNum; x++) {

picReader.read((char*)&picPix[x], sizeof(BYTE));//获取文件数据部分 } } } }

BMPbase::~BMPbase() {

for (int x = 0; x < BmpPic.bmpWidth; x++) {

delete[] picPix; } }

bool BMPbase::isReadFileSuccess() {

return fileSuccess; }

bool BMPbase::isBmpFile() {

return bmpFileflag; }

BitmapFileHeader BMPbase::getBmpHedader() {

return bmpHeader; }

BitmapFileInfo BMPbase::getBmpInfo() {

return BmpPic; }

bool BMPbase::isBmpBitRight() {

return bmpBitRight; }

bool BMPbase::isFileCompression() {

return fileCompression; }

BYTE* BMPbase::getPicPix() {

return picPix; }

本文来源:https://www.bwwdw.com/article/g5do.html

Top