(от ) — формат хранения растровых изображений, разработанный компанией Microsoft. Файлы формата BMP могут иметь расширения .bmp, .dib и .rle.

Формат BMP пользуется широкой поддержкой среди множества программных продуктов, так как он интегрирован в операционные системы Windows и OS/2. Кроме того, данные в этом формате могут быть включены в двоичные файлы ресурсов (RES) и PE-файлы.

Формат BMP предназначен для хранения однослойных растровых изображений. В разных файлах каждый пиксель может иметь различное количество бит, что определяет глубину цвета. Microsoft предлагает следующие битностные глубины: 1, 2, 4, 8, 16, 24, 32, 48 и 64 бита.

При битностях 8 и ниже цвет кодируется индексом из таблицы цветов (палитры), а при более высоких битностях задаётся непосредственно значением. В любом случае цвет определяется в цветовой модели RGB, как при указании в пикселе, так и в таблице цветов. Однако в битностях 16 и 32 можно получить оттенки серого с глубиной до 16 и 32 бит соответственно. Частичная прозрачность реализуется с помощью альфа-канала, доступного в битностях от 16 бит и выше.

Пиксели в BMP-файлах обычно организованы в виде двумерного массива. Для битностей 4 и 8 применяется сжатие по алгоритму RLE, что позволяет уменьшить размер файла. Формат BMP также поддерживает встраивание данных в форматах JPEG и PNG. Однако последнее чаще используется не для компактного хранения, а для преодоления ограничений архитектуры GDI, которая не поддерживает работу с изображениями, отличными от BMP.

В последних версиях формата BMP были добавлены новые возможности управления цветом. В частности, появилась возможность указывать конечные точки, производить гамма-коррекцию и встраивать цветовые профили ICC.

DIB и DDB При использовании формата DIB (, аппаратно-независимый растр) программист может получить доступ ко всем элементам структур, описывающих изображение, при помощи обычного указателя. Но эти данные не используются для непосредственного управления экраном, так как они всегда хранятся в системной памяти, а не в специализированной видеопамяти. Формат пикселя в оперативной памяти может отличаться от того формата, который должен заноситься в видеопамять для индикации точки такого же цвета. Например, в DIB-формате может использоваться 24 бита для задания пикселя, а графический адаптер в этот момент может работать в режиме HiColor с цветовой глубиной 16 бит. При этом ярко-красная точка в аппаратно-независимом формате будет задаваться тремя байтами 0000FF16, а в видеопамяти — словом F80016. При копировании картинки на экран система будет тратить дополнительное время на преобразование кодов цвета из 24-битного формата в формат видеобуфера.

Формат DDB (, аппаратно-зависимый растр) всегда содержит цветовые коды, совпадающие с кодами видеобуфера, но храниться он может как в системной, так и в видеопамяти. В обоих случаях он содержит только коды цвета в том формате, который обеспечит пересылку изображения из ОЗУ в видеопамять при помощи простого копированияЕвченко А. И. OpenGL и DirectX. Программирование графики (Для профессионалов), 2006 г. С. 183..

Внутреннее строение

Официальную информацию по формату BMP можно найти в MSDN или справке Microsoft Windows SDK (может идти в комплекте с некоторыми IDE). В файле WinGDI.h от компании Microsoft есть все объявления на языке C++, которые касаются данного формата. В данную статью же не были включены объявления типов, так как от этого она может быть слишком громоздкой. К тому же официальные объявления некоторые разработчики могут посчитать неудобными и поэтому их востребованность сомнительна. Если вам потребуются оригинальные имена констант, структур, типов и их полей, то они все есть в тексте данной статьи.

Максимальный размер неделимых ячеек (исключая поля битовых структур): 32 бита и поэтому формат можно классифицировать как 32-битный. Исключением могут быть 64-битные пиксели, но значения их каналов можно обрабатывать и 16-битными словами. Порядок байт в 16-битных и 32-битных ячейках повсюду от младшего к старшему (little-endian). Целые числа записываются в прямом коде, со знаком — в дополнительном. Если сравнивать с аппаратными архитектурами, то порядок байт и формат чисел соответствует x86.

В данной статье для указания типов используются имена типов WinAPI как в документации Microsoft. Кроме специфических (описаны отдельно в тексте статьи) можно встретить четыре числовых типа: BYTE — 8-битное беззнаковое целое. WORD — 16-битное беззнаковое целое. DWORD — 32-битное беззнаковое целое. LONG — 32-битное целое со знаком.

В формате Windows Bitmap под структурами понимается блок с идущими подряд ячейками различного фиксированного размера, у которых есть условные имена (есть во многих языках программирования), а не что-то сложнее (например, поток команд произвольного размера).

У некоторых элементов формата указана версия Windows, начиная с которой он поддерживается. Речь идёт в первую очередь об основных библиотеках WinAPI таких как gdi32.dll, shell32.dll, user32.dll и kernel32.dll. Другие компоненты операционной системы (например, GDI+, .NET, DirectX) могут иметь другие более широкие возможности.

Общая структура Данные в формате BMP состоят из трёх основных блоков различного размера:

Заголовок из структуры BITMAPFILEHEADER и блока BITMAPINFO. Последний содержит: Информационные поля. Битовые маски для извлечения значений цветовых каналов (опциональные). Таблица цветов (опциональная). Цветовой профиль (опциональный). Пиксельные данные.

При хранении в файле все заголовки идут с самого первого байта. Пиксельные данные могут находиться на произвольной позиции в файле (она указывается в поле OffBits структуры BITMAPFILEHEADER), в том числе и в удалении от заголовков. Опциональный цветовой профиль появился в версии 5 и он также может свободно располагаться, но его позиция указывается от начала BITMAPINFO (в поле ProfileData).

В оперативной памяти (например, при взаимодействии с WinAPI-функциями GDI) из заголовков исключается структура BITMAPFILEHEADER. При этом Microsoft рекомендует располагать цветовой профиль сразу за заголовками в едином блокеСм. раздел «Remarks» статьи «BITMAPV5HEADER structure » на MSDN.. Пиксельные данные могут иметь произвольное расположение в памяти и их адрес указывается в параметрах процедур. В любом случае рекомендуется в памяти все блоки содержать по адресам кратным четырём: в заголовках присутствуют 32-битные ячейки, а к пиксельным данным такое требование указано в документацииСм. раздел «Remarks» в статье «BITMAPINFO structure » на MSDN.. Это требование справедливо только для оперативной памяти: при хранении в файле его придерживаться не обязательно.

BITMAPFILEHEADER BITMAPFILEHEADER — 14-байтная структура, которая располагается в самом начале файла. Обратите внимание на то, что с самого начала структуры сбивается выравнивание ячеек. Если для вас оно важно, то в оперативной памяти данный заголовок располагайте по чётным адресам, которые не кратны четырём (тогда 32-битные ячейки попадут на выравненные позиции).

Поз.(hex) Размер (байты) Имя Тип WinAPI Описание 00 2 bfType WORD Отметка для отличия формата от других (сигнатура формата). Может содержать единственное значение 4D4216/424D16 (little-endian/big-endian). 02 4 bfSize DWORD Размер файла в байтах. 06 2 bfReserved1 WORD Зарезервированы и должны содержать ноль. 08 2 bfReserved2 WORD 0A 4 bfOffBits DWORD Положение пиксельных данных относительно начала данной структуры (в байтах).

Сигнатура формата при просмотре содержимого файла текстом в двоичном режиме выглядит как пара ASCII-символов «BM».

BITMAPINFO BITMAPINFO в файле идёт сразу за BITMAPFILEHEADER. Адрес этого блока в памяти напрямую также передаётся некоторым функциям WinAPI (например, SetDIBitsToDevice или CreateDIBitmap). Кроме этого, этот же блок используется в форматах значков и курсоров Windows, но в данной статье этот момент не рассматривается (см. отдельные описания этих форматов). Данная структура является основной и описательной в формате BMP и поэтому когда просто упомянуто имя поля, то речь идёт о поле в данной структуре.

Блок BITMAPINFO состоит из трёх частей: Структура с информационными полями. Битовые маски для извлечения значений цветовых каналов (присутствуют не всегда). Таблица цветов (присутствует не всегда).

Про битовые маски и таблицу цветов смотрите ниже в отдельных разделах. Здесь далее пойдёт описание структуры с информационными полями.

В момент написания данной статьи структура с информационными полями имела четыре версииСм. статью «Bitmap Header Types » в MSDN.: CORE, 3, 4 и 5 (обозначения версий приведены условные в рамках данной статьи для краткости). Для каждой версии Microsoft объявила четыре отдельные структуры с разными именами полей. В данной статье при упоминании поля, которое присутствует в нескольких структурах, берётся общая для всех структур часть в конце имени (например, BitCount вместо bcBitCount, biBitCount, bV4BitCount или bV5BitCount). Версию структуры можно определить по первой 32-битной ячейке (WinAPI-тип DWORD), которая содержит её размер в байтах (беззнаковым целым). Версия CORE отличается от всех своей компактностью и использованием исключительно 16-битных беззнаковых полей. Остальные три содержат идентичные ячейки, к которым в каждой новой версии добавлялись новые.

Ниже представлена обзорная таблица по информационным структурам:

Версия Размер (байты) Имя структуры Версия Windows 9x/NTИнформация о версиях взята из справки по Microsoft Windows SDK, идущая в комплекте с Microsoft Visual Studio 2008 и Embarcadero RAD Studio 2010 (раздел «Requirements» в статьях про данные структуры). Версия Windows CE/MobileСм. разделы «Requirements» в статьях «BITMAPCOREHEADER » и «BITMAPINFOHEADER » применительно к Windows Mobile 6.5 на MSDN. Примечания CORE 12 BITMAPCOREHEADER 95/NT 3.1 и старше CE 2.0/Mobile 5.0 и старше Содержит только ширину, высоту и битность растра. 3 40 BITMAPINFOHEADER 95/NT 3.1 и старше CE 1.0/Mobile 5.0 и старше Содержит ширину, высоту и битность растра, а также формат пикселей, информацию о цветовой таблице и разрешении. 4 108 BITMAPV4HEADER 95/NT 4.0 и старше не поддерживается Отдельно выделены маски каналов, добавлена информация о цветовом пространстве и гамме. 5 124 BITMAPV5HEADER 98/2000 и старше не поддерживается Добавлено указание предпочтительной стратегии отображения и поддержка профилей ICC.

Из-за идентичности полей в версиях 3, 4 и 5 может показаться, что полем Size можно регулировать количество полей, убирая неиспользуемые. В действительности это не корректно, так как здесь размер играет роль версии (в версии CORE хоть и тоже идентичные поля, но другого размера и типа). Никто не гарантирует, что вам не могут попасться заголовки меньших или больших размеров с другим набором полей. Тем не менее, Adobe Photoshop может при сохранении файлов BMP записывать структуры информационных полей с размерами 52 и 56 байт. По сути это урезанная 4-я версия, которая содержит только битовые маски каналов (56 байт — версия с альфа-каналом).

16-битные информационные поля (версия CORE) Обратите внимание на то, что здесь поля ширины и высоты содержат беззнаковые целые, в то время как 32-битные структуры хранят значения со знаком.

Позицияв файле(hex) Позицияв структуре(hex) Размер (байты) Имя Тип WinAPI Описание 0E 00 4 bcSize DWORD Размер данной структуры в байтах, указывающий также на версию структуры (здесь должно быть значение 12). 12 04 2 bcWidth WORD Ширина (bcWidth) и высота (bcHeight) растра в пикселях. Указываются целым числом без знака. Значение 0 не документировано. 14 06 2 bcHeight WORD 16 08 2 bcPlanes WORD В BMP допустимо только значение 1. Это поле используется в значках и курсорах Windows. 18 0A 2 bcBitCount WORD Количество бит на пиксель (список поддерживаемых смотрите в отдельном разделе ниже).

32-битные информационные поля (версии 3, 4 и 5) В таблице ниже поля представлены обзорно. Подробную информацию вы можете найти в разделах далее.