+ -
当前位置:首页 → 问答吧 → C语言BMP读取中WORD类型的bmpType的问题

C语言BMP读取中WORD类型的bmpType的问题

时间:2011-12-12

来源:互联网

我在读取bmp文件的过程中发现,在定义的结构体中不能定义bmpType,必须在主程序中单独定义WORD类型的变量fileType才能正确读取bmp文件,为什么?
网上有一个模糊的解释是说由于结构体内存结构决定,能不能解释详细些?感谢!
代码说明如下:

头文件中tagBITMAPFILEHEADER的定义
C/C++ code
typedef struct tagBITMAPFILEHEADER
{
    //WORD bfType;                //位图文件的类型,必须为“BM”,0~1字节
    DWORD bfSize;                //位图文件的大小,以字节为单位,2~5字节
    WORD bfReserved1;            //位图文件保留字,必须为0,6~7字节
    WORD bfReserved2;            //位图文件保留字,必须为0,8~9字节
    DWORD bfOffBits;            //位图数据的起始位置,以相对于位图文件头的偏移量来表示(10~13)字节
}BITMAPFILEHEADER;


主程序中代码片段:
C/C++ code
WORD FileType;

FILE *fpBMP;
char *FilePath="C:\\BmpTest.bmp";

int main()
{
    fpBMP=fopen(FilePath,"rb");
    fread(&FileType,1,sizeof(WORD),fpBMP);


求详细解答

作者: DiffusionTensorImage   发布时间: 2011-12-12

#pragma pack(1)

作者: zhao4zhong1   发布时间: 2011-12-12

因为结构体字节对齐的问题,可以用如下方式定义结构体。
#pragma pack(push, 1)
struct
{
  // 定义
};
#pragma pack(pop)

不过对BMP的问题,建议按标准分字节读取,也就是先读两个字节得到bfType再读4个字节得到bfSize这种方式,整个结构体直接读出或者直接写入的方法问题多多,可移植性和兼容性都很差。

作者: xrunning   发布时间: 2011-12-12

直接读到内存也没有关系,只要知道这之间还有什么细节还顾及就可以了。

主要就是对齐以及字节序的问题。

作者: sinservice   发布时间: 2011-12-12