摘要:
位图文件头 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;

}
