读bmp文件信息结构

来源:互联网 发布:windows whistler2267 编辑:程序博客网 时间:2024/04/28 00:04

CString bmpfileName;  //bmp图像路径。
CFile bitmapFile;  //文件操作类。
bitmapFile.Open(fileName,CFile::modeRead)  //打开图像文件。
 
BITMAPFILEHEADER m_pBmpFileHeader=(BITMAPFILEHEADER*) new char [sizeof

(BITMAPFILEHEADER)];//给文件信息头分配内存 
 
bitmapFile.Read(m_pBmpFileHeader,sizeof(BITMAPFILEHEADER));//读入文件信息头信息 

BITMAPINFOHEADER m_pBmpInfoHeader=(BITMAPINFOHEADER*) new char [sizeof

(BITMAPINFOHEADER)];//BMP信息头分配内存

bitmapFile.Seek( 14,CFile::begin );//文件信息头占用14个字节。
bitmapFile.Read(m_pBmpInfoHeader,sizeof(BITMAPINFOHEADER)); 

if(m_pBmpFileHeader->bfType!=0x4D42)//判断文件是不是位图文件  
{  
 MessageBox("This is not a bitmap file!!");  
 bitmapFile.Close();  
 return;  

if(m_pBmpInfoHeader->biCompression!=0)//判断图像是不是压缩的,  
{  
MessageBox("This system only support Un-compression!!");  
bitmapFile.Close();  
return;  

DWORD  nPaletteSize ;//位图是位数。
switch(m_pBmpInfoHeader->biBitCount)//判断颜色的位数  
{  
case 1:  
nPaletteSize=2;  
break;  
case 4:  
nPaletteSize=16;  
break;  
case 8:  
nPaletteSize=256;  
break;  
case 24:  
nPaletteSize=0;//当为真彩色时没有颜色表,所以为0  
break;  
default:  
MessageBox("This color is not valid!!");  
bitmapFile.Close();  
return;  

//下面根据不同的图像位数,计算调色板的大小  
m_pBmpInfo=(BITMAPINFO*)new char [sizeof(BITMAPINFOHEADER)+nPaletteSize*sizeof

(RGBQUAD)];//根据调色板大小给位图分配内存  
bitmapFile.Read(&(m_pBmpInfo->bmiColors[0]),nPaletteSize*sizeof(RGBQUAD));//调入调

色板数据到位图信息  
m_pBmpInfo->bmiHeader=*m_pBmpInfoHeader;//给位图信息的位图信息头赋值 

DWORD bytesPerLine=m_pBmpInfoHeader->biWidth*(m_pBmpInfoHeader->biBitCount/8);//

算每行图像所占的字节数  
if(bytesPerLine%4!=0)//当宽度为奇数时  
bytesPerLine=(bytesPerLine/4+1)*4;//对每行图像进行对齐 

/*unsigned int */size=m_pBmpInfoHeader->biHeight*bytesPerLine;//计算图像数据所占大

小  
bitmapFile.Seek( 45 ,CFile::begin );//所有信息头占用45个字节。
BYTE* pDib=(BYTE*)new char[size];//给图像数据分配内存  
bitmapFile.Read(pDib,size);//读入位图数据  
bitmapFile.Close(); 

Int width=m_pBmpInfoHeader->biWidth;//得到图像数据的宽度  
Int height=m_pBmpInfoHeader->biHeight;//得到图像数据的高度  
^@^……