Проблемы с заголовком BITMAPFILEHEADER

#c #winapi #bmp

#c #winapi #bmp

Вопрос:

Я только начал больше узнавать о формате файла .bmp и написал небольшую программу на C .

Вот выдержка из моего кода:

 FILE* imageFile;
fopen_s (amp;imageFile, this->GetImagePath (), "rb");

fread (amp;this->bmfh, sizeof(BITMAPFILEHEADER), 1, imageFile);    
std::cout << bmfh.bfSize << " " << bmfh.bfOffBits << " " << std::endl;
  

Согласно MSDN bmfh.bfSize должен быть возвращен размер файла bitmap.

Но в моем случае bmfh.bfOffBits (54) выше, чем bmfh.bfSize (14)? В чем может быть причина? Потому что моя идея заключалась в том, чтобы выделить память для данных изображения таким образом:

 this->size = bmfh.bfSize - bmfh.bfOffBits;
pixelData = new BYTE[this->size];
  

Комментарии:

1. bmfh — это переменная класса: BITMAPFILEHEADER bmfh;

2. вы уверены, что правильно читаете BMP? (bfType должен быть 19778)

3. Я проверил bfType, и это 19778

4. существуют разные версии этой структуры. Как вы определяете, с каким из них вы столкнулись?

5. Я использую структуру, определенную в Windows. почему это моя ошибка?

Ответ №1:

bmfh.bfOffBits (54) — это размер от начала файла до фактических RGB-данных bmp-файла. Обычно это значение равно 54.

То есть от смещения 0 (от начала файла) до смещения 53 — это заголовок bmp-файла. Таким образом, начиная со смещения 54 и далее, это фактические пиксельные данные RGB файла изображения.

bmfh.bfSize (14) — это фактический размер изображения.

Я пытаюсь поискать в Google по этому вопросу, и это лучший источник, который я нашел.

http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html

Комментарии:

1. Спасибо за ваше исследование. Но возможно ли, что bmfh.bfSize меньше, чем bmfh.bfOffBits? Согласно вашей ссылке bmfh.bfSize содержит размер файла в байтах. И согласно документации Microsoft bmfh.bfOffBits указывает смещение в байтах.

2. Решена моя проблема. bfSize — это размер структуры, а не самого файла :/