我需要使用下面的代码解析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);