在C中解析/读取位图文件

我正在尝试制作一个程序来读取位图文件中的数据(.bmp,Windows文件格式,8位)。 现在我一直在图像数据之前阅读标题。

我使用了bmp的规范,我在这里找到了这些结构来保存bmp的文件头,信息头和图像数据:

typedef struct { unsigned char fileMarker1; unsigned char fileMarker2; unsigned int bfSize; uint16_t unused1; uint16_t unused2; unsigned int imageDataOffset; } FILEHEADER; typedef struct { unsigned int biSize; int width; int height; uint16_t planes; uint16_t bitPix; unsigned int biCompression; unsigned int biSizeImage; int biXPelsPerMeter; int biYPelsPerMeter; unsigned int biClrUsed; unsigned int biClrImportant; } INFOHEADER; typedef struct { unsigned char b; unsigned char g; unsigned char r; } IMAGE; 

我真的没有看到这些错误(除非我的规范来源是错误的,但我看了别的地方,在我看来好吧)。

我正在使用以下代码来测试它是否被正确解析:

 int main(void) { FILEHEADER fh; INFOHEADER ih; FILE *img = fopen("img.bmp", "rb"); fread(&fh, sizeof(unsigned char), sizeof(FILEHEADER), img); fread(&ih, sizeof(unsigned char), sizeof(INFOHEADER), img); printf("fM1 = %c, fM2 = %c, bfS = %u, un1 = %hu, un2 = %hu, iDO = %u\n", fh.fileMarker1, fh.fileMarker2, fh.bfSize, fh.unused1, fh.unused2, fh.imageDataOffset); printf("w = %d, h = %d\n", ih.width, ih.height); return 0; } 

不幸的是,当我运行这个时,我得到了错误的结果

 User$ ./images fM1 = B, fM2 = M, bfS = 0, un1 = 0, un2 = 118, iDO = 2621440 w = 3276800, h = 65536 

根据该链接,未使用的1和2应始终为0.此外,宽度和高度完全错误(它是16×16图像)。

似乎结构上存在某种对齐问题。 有人对这个有经验么? (我不想使用任何图像/位图库,我想自己做所有这些)。

谢谢你的帮助!

是的,我忘记收拾结构了。 这解决了问题。 哎呀:

 typedef struct __attribute__((__packed__)) { unsigned char fileMarker1; unsigned char fileMarker2; unsigned int bfSize; uint16_t unused1; uint16_t unused2; unsigned int imageDataOffset; } FILEHEADER; typedef struct __attribute__((__packed__)) { unsigned int biSize; int width; int height; uint16_t planes; uint16_t bitPix; unsigned int biCompression; unsigned int biSizeImage; int biXPelsPerMeter; int biYPelsPerMeter; unsigned int biClrUsed; unsigned int biClrImportant; } INFOHEADER; typedef struct __attribute__((__packed__)) { unsigned char b; unsigned char g; unsigned char r; } IMAGE;