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