#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 — это размер структуры, а не самого файла :/