字节对齐在24位bmp图像读取中的使用
2012-11-28 21:16
417 查看
1 文件格式
典型的BMP图像文件由四部分组成。
1>位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;
2>位图信息数据结构,它包含有BMP图像的宽、高、压缩方法以及定义颜色等信息;
3>调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4>位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其它小于24位的使用调色板中颜色所引值。
2 位图的读取
在默认字节对齐方式下,这样读取BMP图像会出现错误。由于系统默认情况下,结构体以4字节对齐,这样,对于结构体中不够4个字节的字段,会自动填充,使其也占据4个字节。对于像BMP图像这样采用1字节保存的文件,读取就会出错。
对于这个问题,解决办法有两个:
I> 在读取之前使用
#pragma pack(1)
这条语句,将字节对齐方式设置为1字节对齐即可;
II> 采用如下方式读取
读取文件头:
读取文件信息头:
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图像文件由四部分组成。
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 图像并生成 JPG 缩略图(一)
- BMP图像四字节对齐的问题
- 读取24位 BMP 图像并生成 JPG 缩略图
- 读取并在屏幕上显示24位bmp图像
- c++读取24位BMP图像并处理
- 使用IPicture的OLE实现读取和显示BMP,GIF,JPG,ICO,EMF,WMF图像
- 读取24位BMP图像并生成JPG缩略图(二)
- 使用IPicture的OLE实现读取和显示BMP,GIF,JPG,ICO,EMF,WMF图像
- TGA图像头文件拾取的字节对齐及#pragma pack的使用
- bmp图像的字节对齐问题
- 读取24位BMP图像并生成JPG缩略图
- 【数字图像处理】<纯C++>读取、裁剪、缩放、旋转和存储8位bmp灰度图像
- 黑马程序员之C#学习笔记:使用Stream.Read方法从流中读取字节
- (经典)struct和 union用 sizeof 看字节对齐,以及__declspec( align( # ) ) 和 #pragma pack()的使用方式
- c++读取BMP文件(24位)
- C语言的字节对齐以及#pragma pack的使用
- 【无浪】用MFC读取BMP图像
- 获取BMP图像的数据(以数组矩阵形式读取出来)&&将数组矩阵数据转成BMP图像
- vc使用opencv库 读取图像
- BMP图四字节对齐的问题