Может ли поле ширины в 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-разрядный со знаком Это должно исправить

Другие вопросы по тегам