www.pudn.com > hongmodingweiyuanchengxu.rar > ReadBmpFile.h
//读取256色的BMP图像文件 并返回像素数据
/*
本程序是练习时顺手写的程序,简陋至极,欢迎高手指点。
“打开”一幅虹膜样本就可以进行操作。
作者: 吴春雷
QQ: 26885133
群: 29153069
EMail: wuchunlei@163.com
*/
class CReadBmpFile{
public:
inline CReadBmpFile(){
bIsOpen=false;
}
inline ~CReadBmpFile(){
CloseBmpFile();
}
public:
void OpenBmpFile(CString sFilePath); //打开文件
inline unsigned char **GetBmpData(){ //返回像素数据
return sBmpData;
}
inline BITMAPINFOHEADER GetInfoHeader(){ //返回文件结构信息
return stBmpInfoHeader;
}
inline BITMAPFILEHEADER GetFileHeader(){ //返回头文件信息
return stBmpFileHeader;
}
inline RGBQUAD *GetRgbQuad(){ //返回调色板信息
return stRgbQuad;
}
private:
void ReadBmpData(); //读取数据
void CloseBmpFile(); //关闭文件
private:
BITMAPINFOHEADER stBmpInfoHeader; //位图文件结构信息
BITMAPFILEHEADER stBmpFileHeader; //文件头信息
RGBQUAD *stRgbQuad; //调色板信息
unsigned char **sBmpData; //保存像素数据
CFile m_BmpFile; //文件
bool bIsOpen; //文件打开标志
};
void CReadBmpFile::OpenBmpFile(CString sFilePath){
CloseBmpFile();
if (!m_BmpFile.Open((LPCTSTR)sFilePath,CFile::modeRead)){
AfxMessageBox("文件打开失败!");
return ;
}
//读取文件头
m_BmpFile.Read(&stBmpFileHeader,sizeof(BITMAPFILEHEADER));
m_BmpFile.Read(&stBmpInfoHeader,sizeof(BITMAPINFOHEADER));
//判断文件是否为BMP文件
if(stBmpFileHeader.bfType!=0x4d42){
AfxMessageBox("图像不是BMP格式!");
return ;
}
//判断文件是否为256色
if (stBmpInfoHeader.biBitCount!=8){
AfxMessageBox("不是256色BMP图像!");
return ;
}
bIsOpen=true;
ReadBmpData();
}
void CReadBmpFile::ReadBmpData(){
int i,j;
long nHeight,nWidth;
int nBC; //行补偿
unsigned char cTemp;
unsigned char sTemp[4]={0};
nWidth=stBmpInfoHeader.biWidth;
nHeight=stBmpInfoHeader.biHeight;
//读取调色板
stRgbQuad=new RGBQUAD [stBmpInfoHeader.biClrUsed];
// stRgbQuad=(RGBQUAD*)malloc(sizeof(RGBQUAD)*stBmpInfoHeader.biClrUsed);
m_BmpFile.Seek(0x36,CFile::begin); //定位
m_BmpFile.Read(stRgbQuad,sizeof(stRgbQuad)*stBmpInfoHeader.biClrUsed); //读出调色板
//计算行补偿
nBC=4-nWidth%4;
if (nBC==4) nBC=0;
//读取数据
sBmpData=new unsigned char *[nHeight]; //为数据区分配空间
for (i=0;i