如何在C中以简单(初学者友好)的方式解析BMP头



我需要使用下面的代码解析BMP头

#include <stdint.h>
typedef uint16_t WORD;
typedef uint32_t DWORD;
typedef int32_t LONG;
// https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapfileheader
typedef struct tagBITMAPFILEHEADER {
WORD  bfType;
DWORD bfSize;
WORD  bfReserved1;
WORD  bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
// https://learn.microsoft.com/pl-pl/previous-versions/dd183376(v=vs.85)
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG  biWidth;
LONG  biHeight;
WORD  biPlanes;
WORD  biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG  biXPelsPerMeter;
LONG  biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

我的目标是以这种方式打印输出

bfType:          0x4D42 (BM)
bfSize:          369738
bfReserved1:     0x0
bfReserved2:     0x0
bfOffBits:       138

我尝试过读取BMP文件C++(读取BMP头有问题(,但使用__attribute__((__packed__))会让人困惑,并更改了我需要使用的代码。

我有一个开始:

int main(int argc, char **argv) {                                                                                                                                                                                                                             
FILE * fPointer;
fPointer = fopen(argv[1], "rb");  // read from file

但是,我不知道如何将"HEADER"one_answers"INFO"存储在上面声明的结构中。有人能帮我走那一步吗?

据我所知,您需要读取文件头。要做到这一点,您需要将数据写入现有的结构中。BMP文件中的信息以与结构中的变量相同的顺序保存。通过创建一个单独的函数来实现读取将更正确,该函数将返回一个已经准备好的结构和您需要的数据

BITMAPFILEHEADER *ReadBMFileHeader(FILE *fp)
{
BITMAPFILEHEADER *header = (BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER));
fread(&header.bfType, 2, 1, fp);
fread(&header.bfSize, 4, 1, fp);
fread(&header.bfReserve1, 2, 1, fp);
fread(&header.bfReserve2, 2, 1, fp);
fread(&header.bfOffBits, 4, 1, fp);
return header;
}

所以你的主要功能是这样的:

int main(int argc, char *argv[])
{
FILE *fPointer = fopen(argv[1], "rb");
BITMAPFILEHEADER *bmFileHeader = NULL;
bmFileHeader = ReadBMFileHeader(fPointer);
fclose(fp);
return 0;
}

要以十六进制打印数据,可以使用以下方法:

printf("%xn", bmFileHeader->bfType);

最新更新