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

问题描述 投票:0回答:1

我需要用下面的代码来解析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 "存储在上面声明的结构中。谁能帮我完成这个步骤?

c parsing bmp
1个回答
0
投票

根据我的理解,你需要读取文件头。要做到这一点,你需要将数据写入你所拥有的结构中,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);
© www.soinside.com 2019 - 2024. All rights reserved.