Расширение имени файла | .bmp , .dib |
---|---|
Тип интернет-СМИ | image/bmp [1]image/x-bmp |
Типовой код | 'BMP ' 'BMPf' 'BMPp' |
Единый идентификатор типа (UTI) | com.microsoft.bmp |
Разработан | Корпорация Майкрософт |
Тип формата | Растровая графика |
Открытый формат ? | OSP для WMF |
Формат файла BMP , также известный как файл растрового изображения , независимый от устройства формат файла растрового изображения (DIB) и растровое изображение , представляет собой формат файла растрового графического изображения, используемый для хранения растровых цифровых изображений независимо от устройства отображения (например, графического адаптера ), особенно в операционных системах Microsoft Windows [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»требуются для функций API буфера обмена Windows, а также для некоторых шаблонных кистей и функций ресурсов 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 BITMAPCOREHEADER 2 | Добавляет полутоновое изображение . Добавляет сжатие RLE и Huffman 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 | Количество бит на пиксель |
Windows 2.x BITMAPCOREHEADER отличается от OS / 2 1.x BITMAPCOREHEADER (показанного в таблице выше) тем, что поля ширины и высоты изображения являются целыми числами со знаком, а не беззнаковыми. [13]
Версии после BITMAPCOREHEADER добавляют поля только в конец заголовка предыдущей версии. Например: BITMAPV2INFOHEADER добавляет поля в BITMAPINFOHEADER , а BITMAPV3INFOHEADER добавляет поля в BITMAPV2INFOHEADER .
Интегрированный альфа-канал был представлен с недокументированным BITMAPV3INFOHEADER и с документированным BITMAPV4HEADER (начиная с Windows 95 ) и используется в системе входа в систему и темами Windows XP, а также в Microsoft Office (с версии 2000); он поддерживается некоторым программным обеспечением для редактирования изображений , таким как Adobe Photoshop с версии 7 и Adobe Flash с версии MX 2004 (тогда известный как Macromedia Flash). Он также поддерживается GIMP , Google Chrome , 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 n |
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 Metafile CMYK |
13 | BI_CMYKRLE4 | РЛЭ-4 | только Windows Metafile 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 (12 байтов) или BI_ALPHABITFIELDS (16 байтов). . Следовательно, его смещение - это размер BITMAPFILEHEADER плюс размер заголовка DIB (плюс необязательные 12–16 байтов для трех или четырех битовых масок). Примечание: В Windows CE BITMAPINFOHEADER заголовок может быть использовано с BI_ALPHABITFIELDS [6] вариантом в элементе biCompression.
Количество записей в палитре равно 2 n (где 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] ) указано, что для 16bpp (и выше) таблица цветов может присутствовать для хранения списка цветов, предназначенных для оптимизации на устройствах с ограниченным доступом. возможность цветного отображения, при этом также указывается, что в таких случаях в этой таблице цветов отсутствуют элементы индексированной палитры. Это может показаться противоречием, если не делается различий между обязательными записями палитры и дополнительным списком цветов.
Пиксельное хранилище
Биты, представляющие пиксели растрового изображения, упакованы в строки. Размер каждой строки округляется до кратного 4 байтам (32-битное DWORD ) путем заполнения.
Для изображений с высотой выше 1 несколько строк с заполнением сохраняются последовательно, образуя массив пикселей.
Общее количество байтов, необходимых для хранения одной строки пикселей, можно рассчитать как:
- ImageWidth выражается в пикселях. В приведенном выше уравнении используются функции пола и потолка .
Общее количество байтов, необходимых для хранения массива пикселей в изображении n бит на пиксель (bpp), с 2 n цветами, может быть вычислено с учетом эффекта округления размера каждой строки до кратного 4 байта. , следующее:
- PixelArraySize = Размер строки · | 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 байта заполнения, Ширина = 3 будет иметь 9 байтов данных и 3 байта заполнения, а Ширина = 4 будет иметь 12 байтов данных без заполнения.
Сжатие
- Индексированные цветные изображения могут быть сжаты с помощью 4-битного или 8-битного алгоритма RLE или 1D Хаффмана .
- OS / 2 BITMAPCOREHEADER 2 Изображения 24bpp могут быть сжаты с помощью 24-битного алгоритма RLE.
- В 16битном и 32BPP изображения всегда хранятся в несжатом.
- Обратите внимание, что при желании изображения с любой глубиной цвета могут быть сохранены без сжатия.
Формат пикселей
- Формат 1 бит на пиксель (1 бит на пиксель) поддерживает 2 различных цвета (например: черный и белый). Значения пикселей хранятся в каждом бите, причем первый (крайний левый) пиксель находится в наиболее значимом бите первого байта. [5] Каждый бит является индексом в таблице из 2 цветов. Неустановленный бит будет относиться к первой записи таблицы цветов, а установленный бит будет относиться к последней (второй) записи таблицы цветов.
- Формат 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, должны быть смежными и неперекрывающимися, но порядок полей выборки произвольный. Наиболее распространенный порядок полей: Alpha, Blue, Green, Red (MSB to LSB). Красная, зеленая и синяя битовые маски действительны только в том случае, если для элемента сжатия заголовка DIB установлено значение BI_BITFIELDS. Альфа-битовая маска действительна всякий раз, когда она присутствует в заголовке DIB или когда для элемента сжатия заголовка DIB установлено значение BI_ALPHABITFIELDS [6] ( только для Windows CE ).
Подтипы видео RGB
Описанный выше механизм BITFIELD позволяет определять десятки тысяч различных форматов пикселей, однако на практике используются только некоторые из них [21], все форматы с палитрой RGB8, RGB4 и RGB1 (отмечены желтым в таблице выше, dshow.h
названия MEDIASUBTYPE ) и:
RGBAX | Подтип RGB | RGBAX | Подтип 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, gray, pal8 и monob ; т.е. bgra был единственным поддерживаемым форматом пикселей с прозрачностью. [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 DPI × 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 DPI × 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 6Э 69 57 | с прямым порядком байтов " Win " | LCS_WINDOWS_COLOR_SPACE |
4Ач | 24ч | 24ч * 00 ... 00 | CIEXYZTRIPLE Конечные точки цветового пространства | Не используется для LCS " Win " или " sRGB " |
6Eh | 4 | 00 00 00 00 | 0 Красная гамма | Не используется для LCS " Win " или " sRGB " |
72ч | 4 | 00 00 00 00 | 0 Зеленая гамма | Не используется для LCS " Win " или " sRGB " |
76ч | 4 | 00 00 00 00 | 0 Синяя гамма | Не используется для LCS " Win " или " 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 | Белый (Альфа: 255), Пиксель (0,3) |
Обратите внимание, что данные растрового изображения начинаются с нижнего левого угла изображения.
Использование формата BMP
Простота формата файла BMP и его широкое распространение в Windows и в других местах, а также тот факт, что этот формат относительно хорошо документирован и имеет открытый формат , делают BMP очень распространенным форматом, который могут использоваться программами обработки изображений из многих операционных систем. читать и писать [ необходима ссылка ] . Файлы ICO и CUR содержат растровые изображения, начинающиеся с BITMAPINFOHEADER.
Многие старые графические пользовательские интерфейсы использовали растровые изображения во встроенных графических подсистемах; [24] , например, Microsoft Windows и OS / 2 площадки GDI подсистема, где формат конкретных используется является Windows , и / 2 растровый формат файла ОС , как правило , с именем с расширением файла из .BMP
. [25]
В то время как большинство файлов BMP имеют относительно большой размер файла из-за отсутствия какого-либо сжатия (или, как правило, кодирования длин серий с низким коэффициентом для паллетированных изображений), многие файлы BMP могут быть значительно сжаты с помощью алгоритмов сжатия данных без потерь , таких как ZIP, потому что они содержат избыточные данные. Некоторые форматы, такие как RAR , даже включают процедуры, специально предназначенные для эффективного сжатия таких данных.
Связанные форматы
Система X Window использует аналогичный формат XBM для черно-белых изображений и XPM ( пиксельная карта ) для цветных изображений. Также существует множество «сырых» форматов, в которых необработанные данные сохраняются без какой-либо другой информации. В Переносные PIXMAP (PPM) и Truevision TGA форматы также существуют, но реже используются - или только для специальных целей; например, TGA может содержать информацию о прозрачности.
Ссылки
- ^ «Соображения IANA» . Типы Windows Image Media . сек. 5. DOI : 10,17487 / RFC7903 . RFC 7903 .
- ^ a b c Джеймс Д. Мюррей; Уильям ванРайпер (апрель 1996 г.). Энциклопедия форматов графических файлов (второе изд.). О'Рейли . BMP . ISBN 1-56592-161-5. Проверено 7 марта 2014 .
- ^ a b c d e f g h Джеймс Д. Мюррей; Уильям ванРайпер (апрель 1996 г.). Энциклопедия форматов графических файлов (второе изд.). О'Рейли . os2bmp . ISBN 1-56592-161-5. Проверено 7 марта 2014 .
- ^ a b «[MS-WMF]: формат метафайлов Windows» . MSDN . 2014-02-13 . Проверено 12 марта 2014 .
- ^ a b c d e f g h i j "DIBs и их использование" . Справка и поддержка Microsoft . Проверено 14 мая 2015 .
- ^ a b c MSDN - BITMAPINFOHEADER (Windows CE 5.0): BI_ALPHABITFIELDS в элементе biCompression
- ^ a b c Типы заголовков растровых изображений MSDN
- ^ a b c Структура MSDN BITMAPINFO
- ^ Фэн Юань - Программирование графики Windows: Win32 GDI и DirectDraw: упакованное растровое изображение, независимое от устройства (CreateDIBPatternBrush, CreateDIBPatternBrushPt, FindResource, LoadResource, LockResource)
- ^ Саммерс, Джейсон (2015-10-30). "pal8os2v2-16.bmp" . Проверено 6 июля 2016 .
- ^ Саммерс, Джейсон (2015-10-30). «БМП Люкс» . Проверено 6 июля 2016 .
- ^ Кокс, Крис (2010-11-15). «Недопустимый формат BMP с альфа-каналом» . Форум Photoshop Windows . Adobe . Архивировано 27 января 2015 года . Проверено 22 мая 2016 .
- ^ https://www.fileformat.info/format/bmp/egff.htm
- ^ a b «Расширения JPEG и PNG для определенных функций и структур растровых изображений» .
- ^ MSDN - BITMAPV4HEADER : член bV4AlphaMask
- ^ MSDN - RGBQUAD: rgbReserved член
- ^ см. примечание в разделе biClrUsed MSDN BITMAPINFOHEADER
- ^ MSDN - BITMAPINFOHEADER : участник biBitCount
- ^ «Типы растровых изображений» . MSDN . 2012-06-03 . Проверено 16 марта 2014 .
- ^ MSDN: Windows CE - Структура BITMAPINFOHEADER
- ^ a b Adobe Photoshop: формат BMP, заархивированный 22 сентября 2011 г. на Wayback Machine
- ^ a b «Подтипы несжатого видео RGB» . dshow.h . MSDN . Проверено 11 марта 2014 .
- ^ «Форматы изображений» . Общая документация FFmpeg . 2014 . Проверено 23 февраля 2014 .
- ^ Джулиан Смарт; Стефан Чомор и Кевин Хок (2006). Кросс-платформенное программирование графического интерфейса пользователя с помощью Wxwidgets . Прентис Холл. ISBN 0-13-147381-6.
- ^ «Файл растрового изображения (BMP), версия 5» . Цифровое сохранение . Библиотека Конгресса . 2014-01-08 . Проверено 11 марта 2014 .
Внешние ссылки
- Структура растрового файла , на digicamsoft.com
- Введение в DIB (растровые изображения , не зависящие от устройства) на сайте herdsoft.com
- Класс C ++ простого загрузчика растровых изображений , на сайте kalytta.com (A2R10G10B10 еще не [Обновить]поддерживается)
- Формат файла BMP, часть 1 Дэвид Чарлэп из журнала программных инструментов доктора Добба (drdobbs.com), март 1995 г.