读取BMP位图格式

Posted on 2007-08-03 22:53  阿·凡  阅读(593)  评论(0)    收藏  举报
摘要:
位图文件头 BITMAPFILEHEADER bmfh
位图信息头 BITMAPINFOHEADER bmih
彩色表 RGBQUAD          aColors[]
图像数据区 BYTE         aBitmapBits[]
解决方案:
读取bmp文件原码  
typedef struct BMPTYPE
{
 BITMAPFILEHEADER bmpfileheader;
 BITMAPINFOHEADER bmpinfoheader;
 RGBQUAD          
*rgb;
 unsigned 
char    *bmpbuffer;
}
BitmapType,*PBitmapType;

int LoadBmpFile(char *filename, BitmapType *bmp)

 
if(!filename) return BITMAP_FILE_NULL_ERROR;
 
//打开bmp文件
 FILE  * fBitmap=NULL;
 fBitmap
=fopen(filename,"rb");
 
if(!fBitmap) 
    
return BITMAP_FILE_OPEN_ERROR;

 
//读取文件头
 if(!bmp) return BITMAP_ERROR;
 
long size=sizeof(bmp->bmpfileheader);
 fread(
&bmp->bmpfileheader,size,1,fBitmap);
 
 
if(bmp->bmpfileheader.bfType!=0x4D42)  //'BM'
  return BITMAP_FILE_NOTBMP_ERROR;

 unsigned 
long filesize=bmp->bmpfileheader.bfSize;
 unsigned 
long offbit=bmp->bmpfileheader.bfOffBits;

 
//读取文件信息头
 size=sizeof(bmp->bmpinfoheader);
 fseek(fBitmap,
0x0e,SEEK_SET);
 fread(
&bmp->bmpinfoheader,size,1,fBitmap);
   
 
//读取调色板
 
//256色位图
 if(bmp->bmpinfoheader.biBitCount==8)
 
{
  
//读取调色板1024个字节
  if(bmp->rgb!=NULL)
  
{
   delete[] bmp
->rgb;
      bmp
->rgb=NULL;
  }

  bmp
->rgb=new RGBQUAD[256];
  fseek(fBitmap,
0x32,SEEK_SET);
  fread(bmp
->rgb,sizeof(RGBQUAD)<<8,1,fBitmap);
 }

 
//16色位图
 else if(bmp->bmpinfoheader.biBitCount==4)
 
{
  
//读取调色板64个字节
  if(bmp->rgb!=NULL)
  
{
   delete[] bmp
->rgb;
      bmp
->rgb=NULL;
  }

  bmp
->rgb=new RGBQUAD[16];
  fseek(fBitmap,
0x32,SEEK_SET);
  fread(bmp
->rgb,sizeof(RGBQUAD)<<4,1,fBitmap);
 }


 
//读取图像数据
 size=bmp->bmpfileheader.bfSize-bmp->bmpfileheader.bfOffBits+1;
 
if(bmp->bmpbuffer)
 
{
  delete[] bmp
->bmpbuffer;
  bmp
->bmpbuffer=NULL;
 }

 bmp
->bmpbuffer=new unsigned char[size];
 fseek(fBitmap,bmp
->bmpfileheader.bfOffBits,SEEK_SET);
 fread(bmp
->bmpbuffer,size,1,fBitmap);

 
return BITMAP_FILE_SUCCEFF;

}

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3