Может ли поле ширины в BMP с BITMAPINFOHEADER быть отрицательным?
Я недавно обнаружил, что BMP-изображения могут иметь отрицательную высоту, то есть пиксели хранятся в файле сверху вниз. Наш производственный код отклонил файл от пользователя, поскольку он интерпретировал высоту как 4294966272 (32-разрядное значение без знака), тогда как на самом деле это было -1024 (32-разрядное значение со знаком), что фактически означало высоту 1024 пикселей. Самая "официальная" документация формата BITMAPINFOHEADER, которую мне удалось найти, находится в Википедии, в которой говорится, что ширина также signed integer
, Как правильно проверить ввод BMP?
1 ответ
Поскольку формат BMP используется в Windows начиная с версии 2.0, я бы использовал MSDN в качестве наиболее "официальной" документации. В MSDN мы находим следующее определение BITMAPINFOHEADER:
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, *PBITMAPINFOHEADER;
Как вы можете видеть, biHeight определяется как long, который обычно совпадает со знаком int. Если ваш код не читает это значение должным образом, я бы сказал, что где-то есть ошибка.
Изменить с 32-разрядного без знака на 32-разрядный со знаком Это должно исправить