您的位置:首页 > 其它

字节对齐在24位bmp图像读取中的使用

2012-11-28 21:16 417 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BMP图像 字节对齐