Перейти к основному содержимому

Форматы файлов

Что такое BMP? Подробно о формате растровых изображений

BMP является несжатым форматом растровых изображений Windows без потерь. Разбираем структуру его заголовков, глубину цвета, ограничения и способы уменьшить размер файлов.

Автор: Hemen Dönüştür Editör EkibiОпубликовано: 7 мин чтения

Обложка руководства по формату файлов BMP

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. Распространенные сегодня размеры заголовков:

ЗаголовокРазмерГлавное нововведение
BITMAPCOREHEADER12 байтБазовая структура, совместимая с OS/2 1.x
BITMAPINFOHEADER40 байтСамый распространенный заголовок, со времен Windows 3.0; поля сжатия и разрешения
BITMAPV4HEADER108 байтЦветовые маски, альфа-маска и сведения о цветовом пространстве
BITMAPV5HEADER124 байтаВстроенные или связанные профили 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 надежнее.

Источники

Похожие конвертеры

Все статьи