#pragma once
#include
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; }