我需要用下面的代码来解析BMP头。
#include <stdint.h>
typedef uint16_t WORD;
typedef uint32_t DWORD;
typedef int32_t LONG;
// https://docs.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://docs.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__))
是混乱的,改变了我需要使用的代码。
我有了最开始的代码,但我不知道如何在上面声明的结构中存储'HEADER'和'INFO'。
int main(int argc, char **argv) {
FILE * fPointer;
fPointer = fopen(argv[1], "rb"); // read from file
但是,我不知道如何将 "HEADER "和 "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;
}
要打印HEX格式的数据,你可以用这个。
printf("%x\n", bmFileHeader->bfType);