Формат файла BMP - BMP file format
Расширение имени файла | .bmp , .dib |
---|---|
Тип интернет-СМИ | изображение / BMP [1]изображение / x-bmp |
Типовой код | "БМП" BMPf 'БМПЗ' |
Единый идентификатор типа (UTI) | com.microsoft.bmp |
Разработан | Корпорация Майкрософт |
Тип формата | Растровая графика |
Открытый формат ? | OSP за WMF |
В Формат файла BMP, также известный как файл растрового изображения, формат файла растрового изображения (DIB), независимый от устройства и битовая карта, это растровая графика формат файла изображения используется для хранения битовая карта цифровые изображения, независимо от устройство отображения (например, графический адаптер ), особенно на Майкрософт Виндоус[2] и OS / 2[3] операционные системы.
Формат файла BMP может хранить двумерный цифровые изображения как монохромный и цвет, в различных глубина цвета, и, возможно, с Сжатие данных, альфа-каналы, и цветовые профили. В Метафайл Windows (WMF) охватывает формат файла BMP.[4]
Независимые от устройства растровые изображения и формат файла BMP
Microsoft определила конкретное представление цветных растровых изображений с разной глубиной цвета в качестве помощи для обмена растровыми изображениями между устройствами и приложениями с различными внутренними представлениями. Они назвали эти независимые от устройства растровые изображения или DIB, а формат файла для них называется форматом файла DIB или форматом файла изображения BMP.
По данным службы поддержки Microsoft:[5]
Не зависящие от устройства растровые изображения (DIB) - это формат, используемый для определения независимых от устройств растровых изображений с различным цветовым разрешением. Основная цель DIB - разрешить перенос растровых изображений с одного устройства на другое (отсюда и независимая от устройства часть имени). DIB - это внешний формат, в отличие от зависящего от устройства растрового изображения, которое появляется в системе как растровый объект (созданный приложением ...). DIB обычно переносится в метафайлах (обычно с использованием функции StretchDIBits ()), файлах BMP и буфере обмена (формат данных CF_DIB).
В следующих разделах подробно обсуждаются данные, хранящиеся в файле BMP или DIB. Это стандартный формат файла BMP.[5] Некоторые приложения создают файлы растровых изображений, которые не соответствуют документации Microsoft. Кроме того, используются не все поля; в этих неиспользуемых полях будет найдено значение 0.
Файловая структура
Файл растрового изображения состоит из структур фиксированного размера (заголовков), а также структур переменного размера, появляющихся в заранее определенной последовательности. В файле может появиться множество различных версий некоторых из этих структур из-за длительного развития этого формата файла.
Ссылаясь на схему 1, файл растрового изображения состоит из структур в следующем порядке:
Название структуры | Необязательный | Размер | Цель | Комментарии |
---|---|---|---|---|
Заголовок файла растрового изображения | Нет | 14 байт | Для хранения общей информации о файле растрового изображения | Не требуется после загрузки файла в память |
Заголовок DIB | Нет | Исправленный размер (Существует 7 разных версий) | Для хранения подробной информации о растровом изображении и определения формата пикселей | Сразу следует за заголовком файла Bitmap |
Дополнительные битовые маски | да | 3 или 4 DWORD[6] (12 или 16 байт) | Чтобы определить формат пикселей | Присутствует только в том случае, если заголовок DIB является BITMAPINFOHEADER а член метода сжатия установлен на BI_BITFIELDS или BI_ALPHABITFIELDS |
Таблица цветов | Полу-необязательный | Переменный размер | Чтобы определить цвета, используемые данными растрового изображения (массив пикселей) | Обязательно для глубина цвета ≤ 8 бит |
Gap1 | да | Переменный размер | Выравнивание структуры | Артефакт смещения файла до массива пикселей в заголовке файла Bitmap |
Массив пикселей | Нет | Переменный размер | Чтобы определить фактические значения пикселей | Формат пикселей определяется заголовком DIB или дополнительными битовыми масками. Каждая строка в массиве пикселей дополняется размером, кратным 4 байтам. |
Gap2 | да | Переменный размер | Выравнивание структуры | Артефакт поля смещения данных профиля ICC в заголовке DIB |
Цветовой профиль ICC | да | Переменный размер | Чтобы определить цветовой профиль для управления цветом | Также может содержать путь к внешнему файлу, содержащему цветовой профиль. При загрузке в память как «неупакованный DIB» он располагается между таблицей цветов и Gap1.[7] |
DIB в памяти
Файл растрового изображения, загруженный в память, становится структурой данных DIB - важным компонентом Windows GDI API. Структура данных DIB в памяти почти такая же, как и в формате файла BMP, но не содержит 14-байтового заголовка файла растрового изображения и начинается с заголовка DIB. Для DIB, загруженных в память, таблица цветов может также состоять из 16-битных записей, составляющих индексы для текущей реализованной палитры.[8] (дополнительный уровень косвенности) вместо явных определений цветов RGB. Во всех случаях массив пикселей должен начинаться с адреса памяти, кратного 4 байтам. В неупакованных DIB, загруженных в память, необязательные данные цветового профиля должны располагаться сразу после таблицы цветов и перед промежутком1 и массивом пикселей.[7] (в отличие от рис. 1).
Когда размер gap1 и gap2 равен нулю, структура данных DIB в памяти обычно упоминается как «упакованный DIB» и может упоминаться одним указателем, указывающим на начало заголовка DIB. Во всех случаях массив пикселей должен начинаться с адреса памяти, кратного 4 байтам. В некоторых случаях может потребоваться настроить количество записей в таблице цветов, чтобы заставить адрес памяти массива пикселей быть кратным 4 байтам.[8] Для «упакованных DIB», загруженных в память, необязательные данные цветового профиля должны сразу следовать за массивом пикселей, как показано на диаграмме diag. 1 (с разрывом 1 = 0 и разрывом 2 = 0).[7]
«Упакованные DIB» требуются Windows функции API буфера обмена, а также некоторые функции кисти и ресурсов Windows с рисунком.[9]
Заголовок файла растрового изображения
Этот блок байтов находится в начале файла и используется для идентификации файла. Типичное приложение сначала читает этот блок, чтобы убедиться, что файл на самом деле является файлом BMP и не поврежден. Первые 2 байта формата файла BMP - это символ «B», затем символ «M» в ASCII кодирование. Все целые значения хранятся в прямой порядок байтов формат (т.е. сначала младший байт).
Смещение шестигранника | Offset dec | Размер | Цель |
---|---|---|---|
00 | 0 | 2 байта | В поле заголовка используется для идентификации файла BMP и DIB. 0x42 0x4D в шестнадцатеричный, такой же как BM в ASCII. Возможны следующие записи:
|
02 | 2 | 4 байта | Размер файла BMP в байтах |
06 | 6 | 2 байта | Зарезервированный; Фактическое значение зависит от приложения, которое создает изображение, при создании вручную может быть 0 |
08 | 8 | 2 байта | Зарезервированный; Фактическое значение зависит от приложения, которое создает изображение, при создании вручную может быть 0 |
0A | 10 | 4 байта | Смещение, то есть начальный адрес байта, в котором могут быть найдены данные растрового изображения (массив пикселей). |
Заголовок DIB (заголовок информации о битовой карте)
Этот блок байтов сообщает приложению подробную информацию об изображении, которое будет использоваться для вывода изображения на экран. Блок также соответствует заголовку, используемому внутри Windows и OS / 2, и имеет несколько различных вариантов. Все они содержат поле dword (32-битное) с указанием их размера, чтобы приложение могло легко определить, какой заголовок используется в изображении. Причина того, что существуют разные заголовки, заключается в том, что Microsoft несколько раз расширяла формат DIB. Новые расширенные заголовки могут использоваться с некоторыми функциями GDI вместо старых, обеспечивая большую функциональность. Поскольку GDI поддерживает функцию загрузки файлов растровых изображений, типичные приложения Windows используют эту функцию. Одним из следствий этого является то, что для таких приложений поддерживаемые ими форматы BMP соответствуют форматам, поддерживаемым запущенной версией Windows. См. Дополнительную информацию в таблице ниже.
Размер | Название заголовка | Поддержка ОС | Функции | Написано |
---|---|---|---|---|
12 | BITMAPCOREHEADER OS21XBITMAPHEADER | Windows 2.0 или позже OS / 2 1.x[3] | ||
64 | OS22XBITMAPHEADER | OS / 2 BITMAPCOREHEADER2 | Добавляет полутоновое изображение. Добавляет RLE и Хаффман 1D сжатие. | |
16 | OS22XBITMAPHEADER | Этот вариант предыдущего заголовка содержит только первые 16 байтов, а остальные байты предполагаются нулевыми значениями.[3] Примером такого случая является графический pal8os2v2-16.bmp[10]из пакета BMP Suite.[11] | ||
40 | BITMAPINFOHEADER | Windows NT, 3,1x или позже[2] | Добавляет форматы 16 бит на пиксель и 32 бит на пиксель. Добавляет сжатие RLE. | |
52 | BITMAPV2INFOHEADER | Без документов | Добавляет битовые маски RGB. | Adobe Photoshop |
56 | BITMAPV3INFOHEADER | Официально не документировано, но эта документация была размещена на форумах Adobe сотрудником Adobe с заявлением о том, что стандарт в какой-то момент в прошлом был включен в официальную документацию MS.[12] | Добавляет альфа-канал битовая маска. | Adobe Photoshop |
108 | BITMAPV4HEADER | Windows NT 4.0, 95 или позже | Добавляет тип цветового пространства и гамма-коррекция | |
124 | BITMAPV5HEADER | Windows NT 5.0, 98 или позже | Добавляет Цветовые профили ICC | GIMP |
Смещение (шестнадцатеричное) | Смещение (уб) | Размер (байты) | OS / 2 1.x BITMAPCOREHEADER[3] |
---|---|---|---|
0E | 14 | 4 | Размер этого заголовка (12 байт) |
12 | 18 | 2 | Ширина растрового изображения в пикселях (беззнаковый 16-битный) |
14 | 20 | 2 | Высота растрового изображения в пикселях (беззнаковый 16-битный) |
16 | 22 | 2 | Количество цветных плоскостей, должно быть 1 |
18 | 24 | 2 | Количество бит на пиксель |
Растровые изображения OS / 2 1.x несжаты и не могут иметь 16 или 32 бит на пиксель. |
Windows 2.x BITMAPCOREHEADER отличается от OS / 2 1.x BITMAPCOREHEADER (показанного в таблице выше) тем, что поля ширины и высоты изображения являются целыми числами со знаком, а не беззнаковыми.[13]
Версии после BITMAPCOREHEADER только добавляйте поля в конец заголовка предыдущей версии. Например: BITMAPV2INFOHEADER добавляет поля в BITMAPINFOHEADER, и BITMAPV3INFOHEADER добавляет поля в BITMAPV2INFOHEADER.
Был введен интегрированный альфа-канал с недокументированными BITMAPV3INFOHEADER и с задокументированными BITMAPV4HEADER (поскольку Windows 95 ) и используется в Windows XP система входа и темы, а также Microsoft Office (с v2000); это поддерживается некоторыми редактирование изображений программное обеспечение, такое как Adobe Photoshop начиная с версии 7 и Adobe Flash начиная с версии MX 2004 (тогда известной как Macromedia Flash). Это также поддерживается GIMP, Гугл Хром, Microsoft PowerPoint и Microsoft Word.
По соображениям совместимости большинство приложений используют старые заголовки DIB для сохранения файлов. Поскольку OS / 2 больше не поддерживается после Windows 2000, на данный момент распространенным форматом Windows является BITMAPINFOHEADER заголовок. См. Описание в следующей таблице. Все значения сохраняются как целые числа без знака, если явно не указано иное.
Смещение (шестнадцатеричное) | Смещение (уб) | Размер (байты) | Windows BITMAPINFOHEADER[2] |
---|---|---|---|
0E | 14 | 4 | размер этого заголовка в байтах (40) |
12 | 18 | 4 | ширина растрового изображения в пикселях (целое число со знаком) |
16 | 22 | 4 | высота растрового изображения в пикселях (целое число со знаком) |
1А | 26 | 2 | количество цветных плоскостей (должно быть 1) |
1С | 28 | 2 | количество бит на пиксель, которое представляет собой глубину цвета изображения. Типичные значения: 1, 4, 8, 16, 24 и 32. |
1E | 30 | 4 | используемый метод сжатия. В следующей таблице приведен список возможных значений. |
22 | 34 | 4 | размер изображения. Это размер необработанных данных растрового изображения; для растровых изображений BI_RGB может быть задан фиктивный 0. |
26 | 38 | 4 | горизонтальное разрешение изображения. (пикселей на метр, целое число со знаком) |
2А | 42 | 4 | вертикальное разрешение изображения. (пикселей на метр, целое число со знаком) |
2E | 46 | 4 | количество цветов в цветовой палитре, или от 0 по умолчанию до 2п |
32 | 50 | 4 | количество используемых важных цветов или 0, если важен каждый цвет; обычно игнорируется |
Метод сжатия (смещение 30) может быть:
Ценить | Опознано | Метод сжатия | Комментарии |
---|---|---|---|
0 | BI_RGB | никто | Наиболее общий |
1 | BI_RLE8 | RLE 8 бит / пиксель | Может использоваться только с растровыми изображениями 8 бит / пиксель |
2 | BI_RLE4 | RLE 4 бит / пиксель | Может использоваться только с растровыми изображениями 4 бит / пиксель |
3 | BI_BITFIELDS | OS22XBITMAPHEADER: Хаффман 1D | BITMAPV2INFOHEADER: Маски битовых полей RGB, BITMAPV3INFOHEADER+: RGBA |
4 | BI_JPEG | OS22XBITMAPHEADER: RLE-24 | BITMAPV4INFOHEADER+: JPEG изображение для печати[14] |
5 | BI_PNG | BITMAPV4INFOHEADER+: PNG изображение для печати[14] | |
6 | BI_ALPHABITFIELDS | Маски битового поля RGBA | Только Windows CE 5.0 с .NET 4.0 или новее |
11 | BI_CMYK | никто | Только Метафайл Windows CMYK[4] |
12 | BI_CMYKRLE8 | РЛЭ-8 | Только Метафайл Windows CMYK |
13 | BI_CMYKRLE4 | РЛЭ-4 | Только Метафайл Windows CMYK |
OS / 2 2.x OS22XBITMAPHEADER (BITMAPINFOHEADER2 в документации IBM) содержит 24 дополнительных байта:[3]
Смещение (шестнадцатеричное) | Смещение (уб) | Размер (байты) | OS / 2 OS22XBITMAPHEADER (BITMAPINFOHEADER2)[3] |
---|---|---|---|
36 | 54 | 2 | Перечислимое значение, определяющее единицы для горизонтального и вертикального разрешения (смещения 38 и 42). Единственное определенное значение - 0, что означает количество пикселей на метр. |
38 | 56 | 2 | Прокладка. Игнорируется и должен быть равен нулю |
3А | 58 | 2 | Перечислимое значение, указывающее направление, в котором биты заполняют битовую карту. Единственное определенное значение - 0, что означает, что начало координат находится в нижнем левом углу. Биты заполняются слева направо, затем снизу вверх. Обратите внимание, что растровые изображения Windows (которые не включают это поле) также могут указывать начало левого верхнего угла (биты заполняются слева направо, затем сверху вниз) с использованием отрицательного значения для высоты изображения. |
3C | 60 | 2 | Перечислимое значение, указывающее алгоритм полутонового изображения, который следует использовать при визуализации изображения. |
40 | 64 | 4 | Параметр полутонового изображения 1 (см. Ниже) |
44 | 68 | 4 | Параметр полутонового изображения 2 (см. Ниже) |
48 | 72 | 4 | Пронумерованное значение, указывающее кодировку цвета для каждой записи в таблице цветов. Единственное определенное значение - 0, что означает RGB. |
4C | 76 | 4 | Идентификатор, определяемый приложением. Не используется для рендеринга изображений |
Алгоритм полутонового изображения (смещение 60) может быть:
Ценить | Алгоритм полутонового изображения | Комментарии |
---|---|---|
0 | никто | Наиболее общий |
1 | Распространение ошибок | Параметр полутонового изображения 1 (смещение 64) представляет собой процент демпфирования ошибок. 100 означает отсутствие демпфирования. 0 означает, что ошибки не распространяются |
2 | PANDA: алгоритм обработки для получения некодированных документов | Параметры полутонового изображения 1 и 2 (смещения 64 и 68 соответственно) представляют размеры X и Y в пикселях, соответственно, используемого образца полутонового изображения. |
3 | Супер-круг | Параметры полутонового изображения 1 и 2 (смещения 64 и 68 соответственно) представляют размеры X и Y в пикселях, соответственно, используемого шаблона полутонового изображения. |
Таблица цветов
Таблица цветов (палитра) находится в файле изображения BMP сразу после заголовка файла BMP, заголовка DIB (и после дополнительных трех красных, зеленых и синих битовых масок, если BITMAPINFOHEADER заголовок с опцией BI_BITFIELDS или BI_ALPHABITFIELDS). Следовательно, его смещение - это размер BITMAPFILEHEADER плюс размер заголовка DIB (плюс дополнительные 12 байтов для трех битовых масок).
Примечание: на Windows CE в BITMAPINFOHEADER заголовок можно использовать с BI_ALPHABITFIELDS[6] опция в элементе biCompression.
Количество записей в палитре - либо 2п (где n - количество бит на пиксель) или меньшее число, указанное в заголовке (в OS / 2 BITMAPCOREHEADER формат заголовка, поддерживается только полноразмерная палитра).[3][5] В большинстве случаев каждая запись в таблице цветов занимает 4 байта в следующем порядке: синий, зеленый, красный, 0x00 (исключения см. Ниже). Это индексируется в BITMAPINFOHEADER под функцией biBitCount.
Таблица цветов - это блок байтов (таблица), в котором перечислены цвета, используемые изображением. Каждый пиксель в индексированном цветном изображении описывается числом битов (1, 4 или 8), которое является индексом одного цвета, описанного в этой таблице. Целью цветовой палитры в индексированных цветных растровых изображениях является информирование приложения о фактическом цвете, которому соответствует каждое из этих значений индекса. Назначение таблицы цветов в неиндексированных (не палитрах) растровых изображений - перечислить цвета, используемые растровым изображением, для целей оптимизации на устройствах с ограниченными возможностями отображения цвета и облегчить будущее преобразование в различные форматы пикселей и палитру.
Цвета в таблице цветов обычно указываются в 4 байтах на запись. RGBA32 формат. Таблица цветов, используемая с OS / 2 BITMAPCOREHEADER использует 3 байта на запись RGB24 формат.[3][5] Для DIB, загруженных в память, таблица цветов может дополнительно состоять из 2-байтовых записей - эти записи представляют собой индексы к текущей реализованной палитре.[8] вместо явных определений цветов RGB.
Microsoft не запрещает наличие допустимой битовой маски альфа-канала[15] в BITMAPV4HEADER и BITMAPV5HEADER для индексированных цветных изображений 1bpp, 4bpp и 8bpp, что указывает на то, что записи таблицы цветов могут также указывать альфа-компонент с помощью 8.8.8.[0-8].[0-8] формат через RGBQUAD.rgbReserved[16] член. Однако некоторые версии документации Microsoft запрещают эту функцию, заявляя, что член RGBQUAD.rgbReserved «должен быть равен нулю».
Как упоминалось выше, таблица цветов обычно не используется, если пиксели имеют формат 16 бит на пиксель (16 бит на пиксель) (и выше); в этих файлах растровых изображений обычно нет записей таблицы цветов. Однако документация Microsoft (на веб-сайте MSDN с 16 ноября 2010 г.[17]) указывает, что для 16 бит на пиксель (и выше) может присутствовать таблица цветов для хранения списка цветов, предназначенных для оптимизации на устройствах с ограниченными возможностями цветного отображения, а также указывает, что в таких случаях нет записей проиндексированной палитры в эта таблица цветов. Это может показаться противоречием, если не делается различий между обязательными записями палитры и дополнительным списком цветов.
Пиксельное хранилище
Биты, представляющие пиксели растрового изображения, упакованный рядами. Размер каждой строки округляется до значения, кратного 4 байтам (32-битное DWORD ) путем заполнения.
Для изображений с высотой выше 1 несколько заполненных строк сохраняются последовательно, образуя массив пикселей.
Общее количество байтов, необходимых для хранения одной строки пикселей, можно рассчитать как:
- ImageWidth выражается в пикселях. В приведенном выше уравнении используется функции пола и потолка.
Общее количество байтов, необходимое для хранения массива пикселей в п бит на пиксель (bpp) изображения, с 2п цветов, можно рассчитать, учитывая эффект округления размера каждой строки до кратного 4 байтам следующим образом:
- PixelArraySize = RowSize · |ImageHeight|
- ImageHeight выражается в пикселях. Абсолютное значение необходимо, потому что ImageHeight выражается как отрицательное число для изображений сверху вниз.
Массив пикселей (данные растрового изображения)
Массив пикселей представляет собой блок 32-битных DWORD, который описывает изображение пиксель за пикселем. Обычно пиксели хранятся «снизу вверх», начиная с нижнего левого угла, идя слева направо, а затем построчно снизу вверх.[5] Пока не BITMAPCOREHEADER Несжатые растровые изображения Windows также могут храниться сверху вниз, если значение высоты изображения отрицательное.
В исходной OS / 2 DIB единственными четырьмя допустимыми значениями глубины цвета были 1, 4, 8 и 24 бита на пиксель (bpp).[5] Современные заголовки DIB допускают форматы пикселей с 1, 2, 4, 8, 16, 24 и 32 битами на пиксель (bpp).[18] GDI + также разрешает 64 бита на пиксель.[19]
Байты заполнения (не обязательно 0) должны быть добавлены в конец строк, чтобы увеличить длину строк до кратной четырем байтам. Когда массив пикселей загружается в память, каждая строка должна начинаться с адреса памяти, кратного 4. Это ограничение адреса / смещения является обязательным только для массивов пикселей, загруженных в память. В целях хранения файлов только размер каждой строки должен быть кратен 4 байтам, а смещение файла может быть произвольным.[5] 24-битное растровое изображение с Width = 1 будет иметь 3 байта данных на строку (синий, зеленый, красный) и 1 байт заполнения, тогда как Width = 2 будет иметь 6 байтов данных и 2 байта заполнения, Width = 3 будет иметь 9 байтов данных и 3 байта заполнения, а ширина = 4 будет иметь 12 байтов данных без заполнения.
Сжатие
- Проиндексировано цветные изображения могут быть сжаты с 4 или 8 битами RLE или же Хаффман 1D алгоритм.
- OS / 2 BITMAPCOREHEADER2 24bpp изображения могут быть сжаты с помощью 24-битного алгоритма RLE.
- В 16bpp и 32bpp изображения всегда хранится без сжатия.
- Обратите внимание, что изображения с любой глубиной цвета при желании можно сохранять без сжатия.
Формат пикселей
- Формат 1 бит на пиксель (1 бит на пиксель) поддерживает 2 различных цвета (например: черный и белый). Значения пикселей хранятся в каждом бите, причем первый (крайний левый) пиксель находится в самом старшем бите первого байта.[5] Каждый бит представляет собой указатель в таблице из двух цветов. Неустановленный бит будет относиться к первой записи таблицы цветов, а установленный бит будет относиться к последней (второй) записи таблицы цветов.
- Формат 2 бита на пиксель (2bpp) поддерживает 4 различных цвета и сохраняет 4 пикселя на 1 байт, причем крайний левый пиксель находится в двух наиболее значимых битах (Windows CE Только:[20]). Каждое значение пикселя представляет собой 2-битный индекс в таблице, содержащей до 4 цветов.
- Формат 4-бит на пиксель (4bpp) поддерживает 16 различных цветов и сохраняет 2 пикселя на 1 байт, причем крайний левый пиксель находится в более значимом грызть.[5] Каждое значение пикселя представляет собой 4-битный индекс в таблице, содержащей до 16 цветов.
- Формат 8 бит на пиксель (8bpp) поддерживает 256 различных цветов и сохраняет 1 пиксель на 1 байт. Каждый байт является индексом в таблице, содержащей до 256 цветов.
- Формат 16 бит на пиксель (16 бит на пиксель) поддерживает 65536 различных цветов и сохраняет 1 пиксель на 2-байтовое СЛОВО. Каждое СЛОВО может определять альфа, красный, зеленый и синий образцы пикселя.
- Формат 24-битных пикселей (24bpp) поддерживает 16 777 216 различных цветов и сохраняет значение 1 пикселя на 3 байта. Каждое значение пикселя определяет образцы красного, зеленого и синего цвета пикселя (8.8.8.0.0 в нотации RGBAX). Конкретно в порядке: синий, зеленый и красный (по 8 бит на каждый отсчет).[5]
- Формат 32 бит на пиксель (32 бит на пиксель) поддерживает 4 294 967 296 различных цветов и сохраняет 1 пиксель на 4-байтовый DWORD. Каждый DWORD может определять альфа, красный, зеленый и синий образцы пикселя.
Чтобы разрешить неоднозначность того, какие биты определяют, какие выборки, заголовки DIB предоставляют определенные значения по умолчанию, а также определенные BITFIELDS, которые являются битовыми масками, которые определяют принадлежность определенной группы битов в пикселе к определенной канал. Следующая диаграмма определяет этот механизм:
Поля выборки, определенные битовыми масками BITFIELDS, должны быть смежными и не перекрываться, но порядок полей выборки произвольный. Наиболее распространенный порядок полей: альфа, синий, зеленый, красный (от MSB к LSB). Красная, зеленая и синяя битовые маски действительны только тогда, когда элемент сжатия заголовка DIB установлен на BI_BITFIELDS. Альфа-битовая маска действительна всякий раз, когда она присутствует в заголовке DIB или когда элемент сжатия заголовка DIB установлен в BI_ALPHABITFIELDS[6] (Windows CE Только).
Подтипы видео RGB
Описанный выше механизм BITFIELD позволяет определять десятки тысяч различных форматов пикселей, однако на практике используются только некоторые из них,[21] все форматы палитры RGB8, RGB4 и RGB1 (отмечены желтым в таблице выше, dshow.h
MEDIASUBTYPE) и:
R.G.B.A.X. | Подтип RGB | R.G.B.A.X. | Подтип ARGB |
---|---|---|---|
8.8.8.0.8 | RGB32 | 8.8.8.8.0 | ARGB32 |
10.10.10.2.0 | A2R10G10B10 | ||
8.8.8.0.0 | RGB24 | 10.10.10.2.0 | A2B10G10R10 |
5.6.5.0.0 | RGB565 | 4.4.4.4.0 | ARGB4444 |
5.5.5.0.1 | RGB555 | 5.5.5.1.0 | ARGB1555 |
Битовое поле | Компенсировать | Биты A2R10G10B10 | Биты A2B10G10R10 | ||||
---|---|---|---|---|---|---|---|
красный | 36ч | 00 00 F0 3F | LE: 3FF00000 | 20 …29 | FF 03 00 00 | LE: 000003FF | 0 … 9 |
Зеленый | 3Ач | 00 FC 0F 00 | LE: 000FFC00 | 10 …19 | 00 FC 0F 00 | LE: 000FFC00 | 10 …19 |
Синий | 3Eh | FF 03 00 00 | LE: 000003FF | 0 … 9 | 00 00 F0 3F | LE: 3FF00000 | 20 …29 |
Альфа | 42ч | 00 00 00 C0 | LE: C0000000 | 30 …31 | 00 00 00 C0 | LE: C0000000 | 30 …31 |
В версии 2.1.4 FFmpeg поддерживает (в собственной терминологии) форматы пикселей BMP bgra, bgr24, rgb565le, rgb555le, rgb444le, rgb8, bgr8, rgb4_byte, bgr4_byte, серый, pal8, и моноб; т.е. бгра был единственным поддерживаемым форматом пикселей с прозрачностью.[23]
Пример 1
Ниже приведен пример 24-битного растрового изображения размером 2 × 2 пикселя (заголовок Windows DIB BITMAPINFOHEADER) с форматом пикселей RGB24.
Компенсировать | Размер | Шестнадцатеричное значение | Ценить | Описание |
---|---|---|---|---|
BMP заголовок | ||||
0ч | 2 | 42 4D | «БМ» | Поле идентификатора (42h, 4Dh) |
2ч | 4 | 46 00 00 00 | 70 байт (54 + 16) | Размер файла BMP (54 байта заголовка + 16 байтов данных) |
6ч | 2 | 00 00 | Неиспользованный | Для конкретного приложения |
8ч | 2 | 00 00 | Неиспользованный | Для конкретного приложения |
Ах | 4 | 36 00 00 00 | 54 байта (14 + 40) | Смещение, где можно найти массив пикселей (данные растрового изображения) |
Заголовок DIB | ||||
Эх | 4 | 28 00 00 00 | 40 байт | Количество байтов в заголовке DIB (с этого момента) |
12ч | 4 | 02 00 00 00 | 2 пикселя (слева направо) | Ширина растрового изображения в пикселях |
16ч | 4 | 02 00 00 00 | 2 пикселя (порядок снизу вверх) | Высота растрового изображения в пикселях. Положительно для порядка пикселей снизу вверх. |
1Ач | 2 | 01 00 | 1 самолет | Количество используемых цветовых плоскостей |
1Ч | 2 | 18 00 | 24 бит | Количество бит на пиксель |
1Eh | 4 | 00 00 00 00 | 0 | BI_RGB, сжатие массива пикселей не используется |
22ч | 4 | 10 00 00 00 | 16 байт | Размер необработанных данных растрового изображения (включая заполнение) |
26ч | 4 | 13 0B 00 00 | 2835 пикселей / метр по горизонтали | Разрешение печати изображения, 72 точек на дюйм × 39,3701 дюймов на метр дает 2834,6472 |
2Ач | 4 | 13 0B 00 00 | 2835 пикселей / метр по вертикали | |
2Eh | 4 | 00 00 00 00 | 0 цветов | Количество цветов в палитре |
32ч | 4 | 00 00 00 00 | 0 важных цветов | 0 означает, что все цвета важны |
Начало массива пикселей (данные растрового изображения) | ||||
36ч | 3 | 00 00 FF | 0 0 255 | Красный, пиксель (0,1) |
39ч | 3 | FF FF FF | 255 255 255 | Белый, Пиксель (1,1) |
3Ч | 2 | 00 00 | 0 0 | Заполнение для 4-байтового выравнивания (может быть значением, отличным от нуля) |
3Eh | 3 | FF 00 00 | 255 0 0 | Синий, Пиксель (0,0) |
41ч | 3 | 00 FF 00 | 0 255 0 | Зеленый, пиксель (1,0) |
44ч | 2 | 00 00 | 0 0 | Заполнение для 4-байтового выравнивания (может быть значением, отличным от нуля) |
Пример 2
Ниже приведен пример 32-битного растрового изображения размером 4 × 2 пикселя со значениями непрозрачности в альфа-канале (заголовок Windows DIB BITMAPV4HEADER) с форматом пикселей ARGB32.
Компенсировать | Размер | Шестнадцатеричное значение | Ценить | Описание |
---|---|---|---|---|
BMP заголовок | ||||
0ч | 2 | 42 4D | «БМ» | Поле идентификатора (42h, 4Dh) |
2ч | 4 | 9A 00 00 00 | 154 байта (122 + 32) | Размер файла BMP |
6ч | 2 | 00 00 | Неиспользованный | Для конкретного приложения |
8ч | 2 | 00 00 | Неиспользованный | Для конкретного приложения |
Ах | 4 | 7A 00 00 00 | 122 байта (14 + 108) | Смещение, где можно найти массив пикселей (данные растрового изображения) |
Заголовок DIB | ||||
Эх | 4 | 6C 00 00 00 | 108 байт | Количество байтов в заголовке DIB (с этого момента) |
12ч | 4 | 04 00 00 00 | 4 пикселя (слева направо) | Ширина растрового изображения в пикселях |
16ч | 4 | 02 00 00 00 | 2 пикселя (порядок снизу вверх) | Высота растрового изображения в пикселях |
1Ач | 2 | 01 00 | 1 самолет | Количество используемых цветовых плоскостей |
1Ч | 2 | 20 00 | 32 бит | Количество бит на пиксель |
1Eh | 4 | 03 00 00 00 | 3 | BI_BITFIELDS, сжатие массива пикселей не используется |
22ч | 4 | 20 00 00 00 | 32 байта | Размер необработанных данных растрового изображения (включая заполнение) |
26ч | 4 | 13 0B 00 00 | 2835 пикселей / метр по горизонтали | Разрешение печати изображения, 72 точек на дюйм × 39,3701 дюймов на метр дает 2834,6472 |
2Ач | 4 | 13 0B 00 00 | 2835 пикселей / метр по вертикали | |
2Eh | 4 | 00 00 00 00 | 0 цветов | Количество цветов в палитре |
32ч | 4 | 00 00 00 00 | 0 важных цветов | 0 означает, что все цвета важны |
36ч | 4 | 00 00 FF 00 | 00FF0000 с прямым порядком байтов | Битовая маска красного канала (действительна, поскольку указан параметр BI_BITFIELDS) |
3Ач | 4 | 00 FF 00 00 | 0000FF00 с прямым порядком байтов | Битовая маска зеленого канала (действительна, поскольку указан параметр BI_BITFIELDS) |
3Eh | 4 | FF 00 00 00 | 000000FF с прямым порядком байтов | Битовая маска синего канала (действительна, поскольку указан параметр BI_BITFIELDS) |
42ч | 4 | 00 00 00 FF | FF000000 с прямым порядком байтов | Битовая маска альфа-канала |
46ч | 4 | 20 6E 69 57 | с прямым порядком байтов "Победить " | LCS_WINDOWS_COLOR_SPACE |
4Ач | 24ч | 24ч * 00 ... 00 | CIEXYZTRIPLE Конечные точки цветового пространства | Не используется для LCS "Победить " или же "sRGB " |
6Eh | 4 | 00 00 00 00 | 0 Красная Гамма | Не используется для LCS "Победить " или же "sRGB " |
72ч | 4 | 00 00 00 00 | 0 Зеленая гамма | Не используется для LCS "Победить " или же "sRGB " |
76ч | 4 | 00 00 00 00 | 0 Синяя гамма | Не используется для LCS "Победить " или же "sRGB " |
Начало массива пикселей (данные растрового изображения) | ||||
7Ач | 4 | FF 00 00 7F | 255 0 0 127 | Синий (Альфа: 127), Пиксель (1,0) |
7Eh | 4 | 00 FF 00 7F | 0 255 0 127 | Зеленый (Альфа: 127), Пиксель (1,1) |
82ч | 4 | 00 00 FF 7F | 0 0 255 127 | Красный (Альфа: 127), Пиксель (1,2) |
86ч | 4 | FF FF FF 7F | 255 255 255 127 | Белый (Альфа: 127), Пиксель (1,3) |
8Ач | 4 | FF 00 00 FF | 255 0 0 255 | Синий (Альфа: 255), Пиксель (0,0) |
8Eh | 4 | 00 FF 00 FF | 0 255 0 255 | Зеленый (Альфа: 255), Пиксель (0,1) |
92ч | 4 | 00 00 FF FF | 0 0 255 255 | Красный (Альфа: 255), Пиксель (0,2) |
96ч | 4 | FF FF FF FF | 255 255 255 255 | Белый (Альфа: 255), Пиксель (0,3) |
Обратите внимание, что данные растрового изображения начинаются с нижнего левого угла изображения.
Использование формата BMP
Простота формата файла BMP и его широкое распространение в Windows и других странах, а также тот факт, что этот формат относительно хорошо документирован и не защищен патентами, делают его очень распространенным форматом, который программы обработки изображений из многих операционных систем могут читать. и писать[нужна цитата ]. ICO и файлы CUR содержат растровые изображения, начинающиеся с BITMAPINFOHEADER.
Много старше графический пользовательский интерфейс использовали растровые изображения в своих встроенных графических подсистемах;[24] например, платформы Microsoft Windows и OS / 2 » GDI подсистема, где конкретным используемым форматом является Формат файлов растровых изображений Windows и OS / 2, обычно именуемые расширение файла из .BMP
.[25]
Хотя большинство файлов BMP имеют относительно большой размер из-за отсутствия какого-либо сжатия (или, как правило, с низким коэффициентом сжатия) кодирование длин серий на изображениях на поддонах), многие файлы BMP можно значительно сжать с помощью сжатие данных без потерь такие алгоритмы как ZIP потому что они содержат избыточные данные. Некоторые форматы, например RAR, даже включать процедуры, специально предназначенные для эффективного сжатия таких данных.
Связанные форматы
В X Window System использует аналогичный XBM формат для черно-белых изображений и XPM (пиксельная карта) для цветных изображений. Также существует множество «сырых» форматов, в которых необработанные данные сохраняются без какой-либо другой информации. В Portable Pixmap (PPM) и Truevision TGA форматы тоже существуют, но используются реже - или только для специальных целей; например, TGA может содержать информацию о прозрачности.
Рекомендации
- ^ «Соображения IANA». Типы Windows Image Media. сек. 5. Дои:10.17487 / RFC7903. RFC 7903.
- ^ а б c Джеймс Д. Мюррей; Уильям ванРайпер (апрель 1996 г.). Энциклопедия форматов графических файлов (Второе изд.). О'Рейли. BMP. ISBN 1-56592-161-5. Получено 2014-03-07.
- ^ а б c d е ж грамм час Джеймс Д. Мюррей; Уильям ванРайпер (апрель 1996 г.). Энциклопедия форматов графических файлов (Второе изд.). О'Рейли. os2bmp. ISBN 1-56592-161-5. Получено 2014-03-07.
- ^ а б «[MS-WMF]: формат метафайлов Windows». MSDN. 2014-02-13. Получено 2014-03-12.
- ^ а б c d е ж грамм час я j «DIB и их использование». Справка и поддержка Microsoft. Получено 2015-05-14.
- ^ а б c MSDN - BITMAPINFOHEADER (Windows CE 5.0): BI_ALPHABITFIELDS в члене biCompression
- ^ а б c MSDN Типы заголовков растровых изображений
- ^ а б c MSDN Структура BITMAPINFO
- ^ Фэн Юань - Программирование графики для Windows: Win32 GDI и DirectDraw: Упакованное независимое от устройства растровое изображение (CreateDIBPatternBrush, CreateDIBPatternBrushPt, FindResource, LoadResource, LockResource)
- ^ Саммерс, Джейсон (2015-10-30). "pal8os2v2-16.bmp". Получено 2016-07-06.
- ^ Саммерс, Джейсон (2015-10-30). «БМП Люкс». Получено 2016-07-06.
- ^ Кокс, Крис (15.11.2010). «Недопустимый формат BMP с альфа-каналом». Photoshop Windows Форум. Adobe. В архиве из оригинала 27.01.2015. Получено 2016-05-22.
- ^ https://www.fileformat.info/format/bmp/egff.htm
- ^ а б «Расширения JPEG и PNG для определенных функций и структур растровых изображений».
- ^ MSDN - BITMAPV4HEADER: Член bV4AlphaMask
- ^ MSDN - RGBQUAD: rgbReserved член
- ^ см. примечание в разделе biClrUsed MSDN BITMAPINFOHEADER
- ^ MSDN - BITMAPINFOHEADER: Член biBitCount
- ^ «Типы растровых изображений». MSDN. 2012-06-03. Получено 2014-03-16.
- ^ MSDN: Windows CE - BITMAPINFOHEADER Структура
- ^ а б Adobe Photoshop: Формат BMP В архиве 2011-09-22 на Wayback Machine
- ^ а б «Подтипы несжатого видео RGB». dshow.h. MSDN. Получено 2014-03-11.
- ^ «Форматы изображений». FFmpeg Общая документация. 2014. Получено 2014-02-23.
- ^ Джулиан Смарт; Стефан Чомор и Кевин Хок (2006). Кросс-платформенное программирование графического интерфейса с помощью Wxwidgets. Прентис Холл. ISBN 0-13-147381-6.
- ^ «Файл растрового изображения (BMP), версия 5». Цифровое сохранение. Библиотека Конгресса. 2014-01-08. Получено 2014-03-11.
внешняя ссылка
- Структура растрового файла, на digicamsoft.com
- Введение в DIB (растровые изображения, независимые от устройства), на herdsoft.com
- Класс C ++ простой загрузчик растровых изображений, на kalytta.com (A2R10G10B10 еще не[Обновить] поддерживается)
- Формат файла BMP, часть 1 Дэвид Чарлэп в журнале программных средств доктора Добба (drdobbs.com), март 1995 г.