Форматы файлов
Что такое BMP? Подробно о формате растровых изображений
BMP является несжатым форматом растровых изображений Windows без потерь. Разбираем структуру его заголовков, глубину цвета, ограничения и способы уменьшить размер файлов.
Автор: Hemen Dönüştür Editör EkibiОпубликовано: 7 мин чтения

BMP является одним из самых старых и простых форматов изображений в мире Windows. Файл BMP обычно записывает пиксели на диск строка за строкой вообще без сжатия. Благодаря этой простоте его легко читать и он не теряет качество, и из-за той же простоты файлы получаются огромными. В этой статье расскажем, откуда появился BMP, что находится внутри файла, разберем тонкости глубины цвета и прозрачности, расскажем, где он встречается сегодня и как конвертировать файлы BMP в более практичные форматы.
Что такое BMP?
BMP (bitmap, расширение .bmp) является растровым форматом файлов изображений, основанным на пикселях. В технической документации его также называют DIB, аппаратно-независимым растровым изображением (device-independent bitmap). «Аппаратно-независимый» означает, что изображение можно интерпретировать одинаково независимо от того, на какой видеокарте или принтере оно было создано: информацию, необходимую для расшифровки цветов, файл несет в собственном заголовке и таблице цветов.
Согласно документации Microsoft по Win32, файл растрового изображения начинается со структуры BITMAPFILEHEADER, за которой следует BITMAPINFOHEADER, BITMAPV4HEADER или BITMAPV5HEADER, затем необязательная таблица цветов и, наконец, данные пикселей. MIME-тип формата image/bmp.
Краткая история: от Windows и OS/2 до наших дней
BMP появился в результате совместной работы Microsoft и IBM над Windows и OS/2 в конце 1980-х годов. Растровые изображения времен Windows 1.0 сильно зависели от устройства вывода; аппаратно-независимая форма получила распространение с выходом Windows 3.0 в 1990 году. Из-за 12-байтного заголовка BITMAPCOREHEADER, определенного для OS/2 Presentation Manager, до сих пор говорят о файлах «OS/2 BMP».
С годами формат расширялся за счет добавления полей в конец заголовка. Согласно описанию формата в Библиотеке Конгресса США, версия 5 появилась вместе с Windows 98 в 1998 году и позволила записывать в файл цветовые профили ICC. Распространенные сегодня размеры заголовков:
| Заголовок | Размер | Главное нововведение |
|---|---|---|
| BITMAPCOREHEADER | 12 байт | Базовая структура, совместимая с OS/2 1.x |
| BITMAPINFOHEADER | 40 байт | Самый распространенный заголовок, со времен Windows 3.0; поля сжатия и разрешения |
| BITMAPV4HEADER | 108 байт | Цветовые маски, альфа-маска и сведения о цветовом пространстве |
| BITMAPV5HEADER | 124 байта | Встроенные или связанные профили ICC, цель рендеринга |
Программы чтения определяют, какой заголовок используется, по значению размера в его первом поле. Это позволяет старым программам игнорировать новые поля и все равно считывать основное.
Что внутри файла BMP
Заголовок файла и сигнатура «BM»
Каждый файл BMP начинается с 14-байтного заголовка файла, первые два байта которого представляют собой символы ASCII BM (в шестнадцатеричном виде 42 4D). В заголовке хранятся общий размер файла и смещение в байтах, с которого начинаются данные пикселей. DIB, помещенный в буфер обмена Windows (формат CF_DIB), не содержит этих 14 байт и начинается сразу с информационного заголовка.
Информационный заголовок
Информационный заголовок содержит ширину, высоту, число бит на пиксель (biBitCount), тип сжатия, горизонтальное и вертикальное разрешение (в пикселях на метр) и количество используемых цветов в таблице цветов.
Таблица цветов (палитра)
В изображениях с 8 битами на пиксель или меньше пиксель является не цветом, а индексом в таблице цветов. В примере из документации Microsoft 16-цветное изображение размером 32x32 имеет массив пикселей размером 32 x 32 x 4 = 4096 бит, потому что для обращения к 16 цветам достаточно 4 бит.
Данные пикселей: строки снизу вверх и выравнивание по 4 байтам
У BMP есть две необычные особенности. Во-первых, если высота положительная, строки хранятся снизу вверх: первая строка в файле является нижней строкой изображения. При отрицательной высоте строки хранятся сверху вниз, но такие изображения нельзя сжимать. Во-вторых, каждая строка дополняется до размера, кратного 4 байтам. Microsoft приводит длину строки (stride) так:
stride = ((width * bitCount + 31) & ~31) >> 3
imageSize = |height| * stride
Для 24-битного изображения 1920x1080 каждая строка занимает 1920 x 3 = 5 760 байт (это уже кратно 4), поэтому данные пикселей занимают 5 760 x 1 080 = 6 220 800 байт. Вместе с 54 байтами заголовков файл весит около 6,2 МБ. Та же картинка в JPG обычно занимает лишь малую долю этого размера.
Глубина цвета, сжатие и прозрачность
Документация BITMAPV5HEADER определяет 1, 4, 8, 16, 24 и 32 бита на пиксель (значение 0 означает, что глубина берется из встроенных данных JPEG или PNG). 1 бит дает черно-белое изображение, 4 бита дают 16 цветов, а 8 бит дают палитру из 256 цветов. При 24 битах каждый пиксель занимает три байта в порядке синий, зеленый, красный.
Поле сжатия может принимать следующие значения:
- BI_RGB: без сжатия. На практике это подавляющее большинство файлов BMP.
- BI_RLE8 и BI_RLE4: простое кодирование длин серий для 8-битных и 4-битных изображений с палитрой. Полезно для больших однотонных областей, почти бесполезно для фотографий.
- BI_BITFIELDS: это не сжатие; маски определяют, где в 16-битных и 32-битных пикселях находятся биты красного, зеленого и синего (например, RGB 565).
- BI_JPEG и BI_PNG: допускают данные JPEG или PNG внутри растрового изображения. Универсальные просмотрщики поддерживают это редко.
Прозрачность является самой непоследовательной областью BMP. Альфа-маска в заголовках V4 и V5 может определить четвертый байт 32-битного пикселя как непрозрачность, но в классическом 32-битном BMP этот байт описан как неиспользуемый, и многие программы его игнорируют. Поэтому 32-битный BMP, который в одной программе выглядит прозрачным, а в другой лежит на черном фоне, вовсе не редкость. Если нужна прозрачность, PNG гораздо надежнее.
Поддержка в системах, браузерах и программах
BMP открывается практически везде. Его читают встроенные просмотрщики Windows и Paint, «Просмотр» в macOS и распространенные просмотрщики Linux. В руководстве MDN по форматам изображений указана поддержка BMP во всех версиях Chrome, Edge, Firefox, Opera и Safari. В том же руководстве подчеркивается, что несжатые файлы BMP очень велики по сравнению с PNG или JPG и для содержимого сайтов их в целом следует избегать.
Где используется BMP сегодня?
- Ресурсы приложений Windows и устаревшие программы: изображения панелей инструментов, графика мастеров установки и некоторые игровые ресурсы по-прежнему хранятся в BMP.
- Встраиваемые системы и микроконтроллеры: устройству с дисплеем не нужен декодер JPEG; данные пикселей можно копировать прямо на экран.
- Промышленные камеры, сканеры и тестовые инструменты: когда нужен сырой результат без потерь, BMP служит простым промежуточным форматом.
- Обучение: заголовок занимает всего несколько десятков байт, поэтому на курсах по обработке изображений BMP часто становится первым форматом, который студенты читают и записывают.
Сильные и слабые стороны
| Сильные стороны | Слабые стороны |
|---|---|
| Без потерь; значения пикселей никогда не меняются | Без сжатия, поэтому файлы очень большие |
| Элементарно читать и записывать, нет нагрузки на процессор | Непоследовательная поддержка прозрачности |
| Открывается почти в любой операционной системе и браузере | Слабая поддержка метаданных (EXIF, описания) |
| Режимы с палитрой подходят для маломощных устройств | Непрактичен для веба, электронной почты и форм загрузки |
Частые проблемы и их решение
Файл слишком большой для почты или формы загрузки
Это самая частая проблема. Для фотографий и сканов конвертация BMP в JPG обычно уменьшает размер на порядок и более. Для снимков экрана, схем и всего, где есть текст, лучше подходит конвертация BMP в PNG: PNG тоже работает без потерь, но сжимает данные и не добавляет шум, который JPG создает вокруг резких краев.
32-битный BMP показывается на черном фоне
Программа не распознает альфа-байт или читает его неправильно. Обычно помогает конвертация в PNG. При конвертации в JPG, где нет прозрачности, прозрачные области заливаются белым или выбранным вами цветом.
Изображение перевернуто или перекошено
В самостоятельно написанной программе чтения причина обычно в одной из двух ошибок: не учтено, что строки хранятся снизу вверх, или не пропускаются байты выравнивания в конце каждой строки. Формула stride выше и проверка знака высоты предотвращают обе.
Программа отказывается открывать BMP
Файлы BMP со сжатием RLE, BI_BITFIELDS или встроенными данными JPEG/PNG некоторые простые программы не поддерживают. Повторное сохранение в несжатый 24-битный BMP или конвертация в PNG устраняет проблему совместимости.
Советы по конвертации
- JPG для фотографий, PNG для графики: при переходе с BMP действует обычное правило. Для веба в конвертере изображений можно также выбрать WebP или AVIF.
- Держите качество высоким: поскольку BMP не имеет потерь, качество JPG 85-90% дает результат, который трудно отличить от оригинала.
- При необходимости уменьшите: если файл все еще большой, уменьшите размеры в пикселях или воспользуйтесь сжатием изображения, чтобы уложиться в нужный размер.
- Обратное направление: если встраиваемому устройству или устаревшей программе нужен BMP, выберите BMP в качестве целевого формата в конвертере изображений. Наши инструменты записывают стандартный несжатый 24-битный BMP; прозрачные области сводятся на выбранный вами цвет фона.
Наши страницы конвертации BMP работают в вашем браузере: файл не загружается и никогда не покидает ваше устройство.
Часто задаваемые вопросы
BMP и DIB это одно и то же?
На практике да. DIB представляет собой структуру аппаратно-независимого растрового изображения, которую Windows использует в памяти и в буфере обмена; файл BMP является той же структурой с 14-байтным заголовком файла впереди.
BMP хранит изображение без потерь?
Да. Несжатые и сжатые RLE файлы BMP сохраняют значения пикселей в точности. Единственное исключение составляют редкие BMP со встроенными данными JPEG.
Теряется ли качество при конвертации BMP в PNG?
Нет. PNG тоже работает без потерь; изображение остается идентичным и становится меньше только за счет сжатия.
Можно ли использовать BMP на сайте?
Браузеры показывают BMP, но файлы получаются неоправданно большими и замедляют страницы. Для веба используйте JPG, PNG, WebP или AVIF.
Поддерживает ли BMP прозрачность?
32-битный BMP теоретически может содержать альфа-канал, но программы поддерживают его непоследовательно. Когда нужна прозрачность, PNG надежнее.


