1 文件格式
典型的BMP图像文件由四部分组成。
1>位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;
2>位图信息数据结构,它包含有BMP图像的宽、高、压缩方法以及定义颜色等信息;
3>调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4>位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其它小于24位的使用调色板中颜色所引值。
2 位图的读取
//读取文件头
fread(&bf,sizeof(bf),1,fi);
//读取文件信息头
fread(&bi,sizeof(bi),1,fi);
在默认字节对齐方式下,这样读取BMP图像会出现错误。由于系统默认情况下,结构体以4字节对齐,这样,对于结构体中不够4个字节的字段,会自动填充,使其也占据4个字节。对于像BMP图像这样采用1字节保存的文件,读取就会出错。
对于这个问题,解决办法有两个:
I> 在读取之前使用
#pragma pack(1)
这条语句,将字节对齐方式设置为1字节对齐即可;
II> 采用如下方式读取
读取文件头:
int ReadFileHeader(char *filename,BITMAPFILEHEADER *bmfh)
{
FILE *fp;
fp=fopen(filename,"rb");
if(!fp)
{
printf("Can not open the file:%s.\n",filename);
return -1;
}
fread(&bmfh->bfType,sizeof(WORD),1,fp);
fread(&bmfh->bfSize,sizeof(DWORD),1,fp);
fread(&bmfh->bfReserved1,sizeof(WORD),1,fp);
fread(&bmfh->bfReserved2,sizeof(WORD),1,fp);
fread(&bmfh->bfOffBits,sizeof(DWORD),1,fp);
fclose(fp);
return 0;
}
读取文件信息头:
int ReadInfoHeader(char *filename,BITMAPINFOHEADER *bmih)
{
FILE *fp;
fp = fopen(filename,"rb");
if(!fp)
{
printf("Can not open the BMP file:%s\n",filename);
return -1;
}
fseek(fp,14,SEEK_SET);
fread(&bmih->biSize,sizeof(DWORD),1,fp);
fread(&bmih->biWidth,sizeof(LONG),1,fp);
fread(&bmih->biHeight,sizeof(LONG),1,fp);
fread(&bmih->biPlanes,sizeof(WORD),1,fp);
fread(&bmih->biBitCount,sizeof(WORD),1,fp);
fread(&bmih->biCompression,sizeof(DWORD),1,fp);
fread(&bmih->biSizeImage,sizeof(DWORD),1,fp);
fread(&bmih->biXPelsPerMeter,sizeof(LONG),1,fp);
fread(&bmih->biYPelsPerMeter,sizeof(LONG),1,fp);
fread(&bmih->biClrUsed,sizeof(DWORD),1,fp);
fread(&bmih->biClrImportant,sizeof(DWORD),1,fp);
fclose(fp);
return 0;
}