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

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;
}

你可能感兴趣的:(字节对齐在24位bmp图像读取中的使用)