Написать программу, разбирающую некоторые заголовки BMP-файла. Ограничения на структуру следующие:
- Рассматриваются только первые два заголовка: «Bitmap file header» и «DIB header»
- Необязательные секции отсутствуют или не влияют на разбор
- Исторический формат «DIB header» — любой (отличаются размерами, всего 8 штук)
Если в заголовке указан тип компрессии и размер картинки, этот размер даётся для распакованной картинки (то есть кратен ширине и высоте с учётом глубины цветности)
Если ширина картинки в байтах не кратна 4, в конец каждой строки пикселей дописывается недостающее число битов — это влияет на общий размер картинки
- Также допустимо, чтобы указанный в заголовке размер картинки
- был равен 0 (тогда он вычисляется из ширины высоты и глубины цвета)
- был на 2 больше вычисленного размера (я не разобрался, в каких случаях это так)
- Других заполнителей и выравнивания нет
Программа должна проверять, соответствуют ли входные данные () структуре BMP-файла, и выводить либо первое найденное несоответствие, либо информацию о файле:
Если в начале файла нет сигнатуры "BM", выводится "Not a Windows BMP"
Если поле «размер BMP-файла» не равно объёмы введённых данных, выводится "Incorrect size"
Если размер DIB header не равен одному из известных, выводится "Incorrect header size"
Если заданный размер картинки не равен вычисленному (с учётом возможного +2 и нулевого значения), выводится "Incorrect image size"
- В противном случае выводятся абсолютные значения ширины, высоты и глубины цветности картинки, а также метод упаковки (если не задан, то 0) и размер заполнителя (0 или 2)
…содержимое weasel2.4c.bmp…
- В некоторых DIB размер Pixel array не задаётся, его надо вычислять, исходя из размера изображения и глубины цвета
- В некоторых DIB размеры могут быть отрицательными
82 73 4 0 0
В примере выше глубина цветности 4 бита на пиксель, следовательно, размер одной строки BMP равен 82 * 4 / 8 = 41 байт. Строка дополняется ещё тремя байтами до кратной 4 длины, и общий размер картинки оказывается 44 * 73 = 3212 байт.