Как разобрать заголовок BMP в C простым (для начинающих) способом - PullRequest
0 голосов
/ 18 апреля 2020

Мне нужно проанализировать заголовок 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__)) сбивает с толку и изменяет код, который мне нужно использовать.

У меня самое начало:

int main(int argc, char **argv) {                                                                                                                                                                                                                             

    FILE * fPointer;
    fPointer = fopen(argv[1], "rb");  // read from file

Однако я не знаю, как хранить 'HEADER' и 'INFO' в структурах, объявленных выше. Может ли кто-нибудь помочь мне с этим шагом?

1 Ответ

0 голосов
/ 22 апреля 2020

Насколько я понимаю, нужно прочитать заголовок файла. Для этого вам нужно записать данные в имеющуюся структуру. Информация в файле 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);
...