Формат BMP — структура и применение растровых файлов Windows
Формат BMP в Windows: заголовки, таблица цветов и массив пикселей, почему файлы большие без сжатия, хранение снизу вверх и когда BMP нужен сегодня.
BMP — формат для сохранения в файл аппаратно-независимого растра (DIB), использовавшегося в Microsoft Windows и OS/2. Это не спецификация международной организации по стандартизации: фактически её роль играет документация Microsoft для разработчиков. Главная особенность — простая структура, благодаря которой любая программа легко читает и записывает такие файлы.
Структура файла
Согласно статье «Bitmap Storage» на Microsoft Learn, файл BMP состоит из следующих частей в таком порядке.
| Порядок | Элемент | Содержимое |
|---|---|---|
| 1 | BITMAPFILEHEADER | Идентификатор файла (BM), размер файла, смещение начала пиксельных данных |
| 2 | BITMAPINFOHEADER (или заголовок V4/V5) | Ширина и высота в пикселях, число бит на пиксель, способ сжатия, разрешение |
| 3 | Таблица цветов (массив RGBQUAD) | Используется в 1-, 4- и 8-битных изображениях с палитрой |
| 4 | Массив пикселей | Собственно данные изображения |
Первые два байта файла — ASCII BM (в шестнадцатеричном виде 42 4D), поэтому даже файл с изменённым расширением можно опознать как BMP по этой сигнатуре. В информационном заголовке есть и поле для разрешения печати (пикселей на метр).
Хранение снизу вверх
Обычный BMP хранит пиксели от нижней строки к верхней (bottom-up). Если значение высоты в заголовке отрицательное, строки хранятся сверху вниз (top-down). Кроме того, в конец каждой строки добавляются байты выравнивания, чтобы число байтов в строке было кратно 4. Это частый источник ошибок при написании собственного парсера BMP.
Пример расчёта размера строки
Строка BMP должна быть выровнена по 4 байта. Если 24-битное изображение шириной 101 пиксель, фактические данные строки занимают 101 × 3 = 303 байта, но добавляется 1 байт выравнивания до кратного 4, и строка хранится как 304 байта. Поэтому общий размер пиксельных данных равен (байтов в строке) × высота в пикселях, а если прибавить заголовок (обычно 54 байта), получится размер файла. Из-за этого правила при ручной работе с изображениями, ширина которых не кратна 4, часто возникает ошибка, когда каждая строка съезжает.
Почему файлы большие
BMP в большинстве случаев хранит сырые пиксели без сжатия. У 24-битного BMP на пиксель приходится 3 байта, поэтому изображение 1920×1080 занимает около 6,2 МБ, а снимок смартфона 4032×3024 — около 36,6 МБ. Для палитровых изображений до 8 бит можно выбрать сжатие RLE (кодирование длин серий), но на фото оно почти не действует. MDN тоже советует избегать BMP в веб-контенте из-за размера.
Прозрачность
У традиционного 24-битного BMP нет альфа-канала. 32-битный BMP с заголовком V4 или V5 может задать альфа-маску, но многие программы не интерпретируют её как прозрачность, поэтому для обмена прозрачными изображениями надёжнее PNG.
Когда BMP используют сегодня
- Старое промышленное оборудование, встраиваемые устройства, чековые принтеры и некоторые корпоративные программы принимают только BMP
- Простые программы и учебные примеры, где нужно работать с пикселями напрямую, без сжатия и распаковки
- Способ хранения небольших изображений внутри иконок Windows (ICO)
На что обратить внимание при конвертации
- BMP → PNG: без потерь, а размер значительно уменьшается. Лучшая конвертация для хранения и обмена.
- BMP → JPG: для фото размер уменьшается в десятки раз, но применяется сжатие с потерями.
- Другие форматы → BMP: проверьте, какую разрядность требует устройство (24 или 8 бит). Прозрачные области заливаются цветом фона. Сохранить в BMP можно в инструменте конвертации изображений.
Попробовать сейчас