Из Википедии, свободной энциклопедии
Перейти к навигацииПерейти к поиску

Формат файла BMP , также известный как файл растрового изображения , независимый от устройства формат файла растрового изображения (DIB) и растровое изображение , представляет собой формат файла растрового графического изображения, используемый для хранения растровых цифровых изображений независимо от устройства отображения (например, графического адаптера ), особенно в операционных системах Microsoft Windows [2] и OS / 2 [3] .

Формат файла BMP позволяет хранить двухмерные цифровые изображения, как монохромные, так и цветные, с различной глубиной цвета и, при необходимости, со сжатием данных , альфа-каналами и цветовыми профилями . Спецификация метафайла Windows (WMF) охватывает формат файла BMP. [4]

Независимые от устройства растровые изображения и формат файла BMP

Диаграмма 1 - Структура файла растрового изображения
Диаграмма 1 - Структура файла растрового изображения

Microsoft определила конкретное представление цветных растровых изображений с разной глубиной цвета в качестве помощи для обмена растровыми изображениями между устройствами и приложениями с различными внутренними представлениями. Они назвали эти независимые от устройства растровые изображения или DIB, а формат файла для них называется форматом файла DIB или форматом файла изображения BMP.

По данным службы поддержки Microsoft: [5]

Независимое от устройства растровое изображение (DIB) - это формат, используемый для определения независимых от устройства растровых изображений с различным цветовым разрешением. Основная цель DIB - разрешить перенос растровых изображений с одного устройства на другое (отсюда и независимая от устройства часть имени). DIB - это внешний формат, в отличие от зависящего от устройства растрового изображения, которое появляется в системе как растровый объект (созданный приложением ...). DIB обычно переносится в метафайлах (обычно с использованием функции StretchDIBits ()), файлах BMP и буфере обмена ( формат данных CF_DIB ).

В следующих разделах подробно обсуждаются данные, хранящиеся в файле BMP или DIB. Это стандартный формат файла BMP. [5] Некоторые приложения создают файлы растровых изображений, несовместимые с документацией Microsoft. Кроме того, используются не все поля; в этих неиспользуемых полях будет найдено значение 0.

Файловая структура

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

Ссылаясь на схему 1, файл растрового изображения состоит из структур в следующем порядке:

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 . Все целочисленные значения хранятся в формате с прямым порядком байтов (т.е. сначала младший байт).

Заголовок DIB (заголовок информации о битовой карте)

Этот блок байтов сообщает приложению подробную информацию об изображении, которая будет использоваться для вывода изображения на экран. Блок также соответствует заголовку, используемому внутри Windows и OS / 2, и имеет несколько различных вариантов. Все они содержат поле dword (32-битное), определяющее их размер, чтобы приложение могло легко определить, какой заголовок используется в изображении. Причина того, что существуют разные заголовки, заключается в том, что Microsoft несколько раз расширяла формат DIB. Новые расширенные заголовки могут использоваться с некоторыми функциями GDI вместо старых, обеспечивая большую функциональность. Поскольку GDI поддерживает функцию загрузки файлов растровых изображений, типичные приложения Windows используют эту функцию. Одним из следствий этого является то, что для таких приложенийподдерживаемые ими форматы BMP соответствуют форматам, поддерживаемым запущенной версией Windows. См. Дополнительную информацию в таблице ниже.

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 . См. Его описание в следующей таблице. Все значения хранятся как целые числа без знака, если явно не указано иное.

Метод сжатия (смещение 30) может быть:

OS / 2 2.x OS22XBITMAPHEADER ( BITMAPINFOHEADER2 в документации IBM) содержит 24 дополнительных байта: [3]

Алгоритм полутонового изображения (смещение 60) может быть:

Таблица цветов

Таблица цветов (палитра) появляется в файле изображения 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, которые являются битовыми масками, которые определяют принадлежность определенной группы битов в пикселе к определенному каналу . Следующая диаграмма определяет этот механизм:

Диаг. 2 - Механизм BITFIELDS для 32-битного пикселя, представленного в нотации длины выборки RGBAX
Диаг. 2 - Механизм BITFIELDS для 32-битного пикселя, представленного в нотации длины выборки RGBAX

Поля выборки, определенные битовыми масками BITFIELDS, должны быть смежными и неперекрывающимися, но порядок полей выборки произвольный. Наиболее распространенный порядок полей: Alpha, Blue, Green, Red (MSB to LSB). Красная, зеленая и синяя битовые маски действительны только в том случае, если для элемента сжатия заголовка DIB установлено значение BI_BITFIELDS. Альфа-битовая маска действительна всякий раз, когда она присутствует в заголовке DIB или когда для элемента сжатия заголовка DIB установлено значение BI_ALPHABITFIELDS [6] ( только для Windows CE ).

Диаг. 3 - Формат пикселей с альфа-каналом для 16-битного пикселя (в обозначении длины образца RGBAX), фактически созданный Adobe Photoshop [21]
Диаг. 3 - Формат пикселей с альфа-каналом для 16-битного пикселя (в обозначении длины образца RGBAX), фактически созданный Adobe Photoshop [21]
Все возможные форматы пикселей в DIB
Все возможные форматы пикселей в DIB

Подтипы видео RGB

Описанный выше механизм BITFIELD позволяет определять десятки тысяч различных форматов пикселей, однако на практике используются только некоторые из них [21], все форматы с палитрой RGB8, RGB4 и RGB1 (отмечены желтым в таблице выше, dshow.hназвания MEDIASUBTYPE ) и:

В версии 2.1.4 FFmpeg поддерживал (в своей собственной терминологии) форматы пикселей BMP: bgra, bgr24, rgb565le, rgb555le, rgb444le, rgb8, bgr8, rgb4_byte, bgr4_byte, gray, pal8 и monob ; т.е. bgra был единственным поддерживаемым форматом пикселей с прозрачностью. [23]

Пример 1 растрового изображения 2 × 2 пикселя с кодировкой 24 бит / пиксель

Пример 1

Ниже приведен пример 24-битного растрового изображения размером 2 × 2 пикселя (заголовок Windows DIB BITMAPINFOHEADER ) с форматом пикселей RGB24.

0,0: blue 0000FF FF0,1: green 00FF00 FF0,2: red FF00000 FF0,3: white FFFFFF FF1,0: blue 0000FF 7F, half transparent1,1: green 00FF00 7F, half transparent1,2: red FF0000 7F, half transparent1,3: white FFFFFF 7F, half transparent
Об этом изображении
Пример 2 растрового изображения 4 × 2 пикселя с кодировкой 32 бит / пиксель

Пример 2

Ниже приведен пример 32-битного растрового изображения 4 × 2 пикселя со значениями непрозрачности в альфа-канале (заголовок Windows DIB BITMAPV4HEADER ) с форматом пикселей ARGB32.

Обратите внимание, что данные растрового изображения начинаются с нижнего левого угла изображения.

Использование формата 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 может содержать информацию о прозрачности.

Ссылки

  1. ^ «Соображения IANA» . Типы Windows Image Media . сек. 5. DOI : 10,17487 / RFC7903 . RFC 7903 .
  2. ^ a b c Джеймс Д. Мюррей; Уильям ванРайпер (апрель 1996 г.). Энциклопедия форматов графических файлов (второе изд.). О'Рейли . BMP . ISBN 1-56592-161-5. Проверено 7 марта 2014 .
  3. ^ a b c d e f g h Джеймс Д. Мюррей; Уильям ванРайпер (апрель 1996 г.). Энциклопедия форматов графических файлов (второе изд.). О'Рейли . os2bmp . ISBN 1-56592-161-5. Проверено 7 марта 2014 .
  4. ^ a b «[MS-WMF]: формат метафайлов Windows» . MSDN . 2014-02-13 . Проверено 12 марта 2014 .
  5. ^ a b c d e f g h i j "DIBs и их использование" . Справка и поддержка Microsoft . Проверено 14 мая 2015 .
  6. ^ a b c MSDN - BITMAPINFOHEADER (Windows CE 5.0): BI_ALPHABITFIELDS в элементе biCompression
  7. ^ a b c Типы заголовков растровых изображений MSDN
  8. ^ a b c Структура MSDN BITMAPINFO
  9. ^ Фэн Юань - Программирование графики Windows: Win32 GDI и DirectDraw: упакованное растровое изображение, независимое от устройства (CreateDIBPatternBrush, CreateDIBPatternBrushPt, FindResource, LoadResource, LockResource)
  10. ^ Саммерс, Джейсон (2015-10-30). "pal8os2v2-16.bmp" . Проверено 6 июля 2016 .
  11. ^ Саммерс, Джейсон (2015-10-30). «БМП Люкс» . Проверено 6 июля 2016 .
  12. ^ Кокс, Крис (2010-11-15). «Недопустимый формат BMP с альфа-каналом» . Форум Photoshop Windows . Adobe . Архивировано 27 января 2015 года . Проверено 22 мая 2016 .
  13. ^ https://www.fileformat.info/format/bmp/egff.htm
  14. ^ a b «Расширения JPEG и PNG для определенных функций и структур растровых изображений» .
  15. ^ MSDN - BITMAPV4HEADER : член bV4AlphaMask
  16. ^ MSDN - RGBQUAD: rgbReserved член
  17. ^ см. примечание в разделе biClrUsed MSDN BITMAPINFOHEADER
  18. ^ MSDN - BITMAPINFOHEADER : участник biBitCount
  19. ^ «Типы растровых изображений» . MSDN . 2012-06-03 . Проверено 16 марта 2014 .
  20. ^ MSDN: Windows CE - Структура BITMAPINFOHEADER
  21. ^ a b Adobe Photoshop: формат BMP, заархивированный 22 сентября 2011 г. на Wayback Machine
  22. ^ a b «Подтипы несжатого видео RGB» . dshow.h . MSDN . Проверено 11 марта 2014 .
  23. ^ «Форматы изображений» . Общая документация FFmpeg . 2014 . Проверено 23 февраля 2014 .
  24. ^ Джулиан Смарт; Стефан Чомор и Кевин Хок (2006). Кросс-платформенное программирование графического интерфейса пользователя с помощью Wxwidgets . Прентис Холл. ISBN 0-13-147381-6.
  25. ^ «Файл растрового изображения (BMP), версия 5» . Цифровое сохранение . Библиотека Конгресса . 2014-01-08 . Проверено 11 марта 2014 .

Внешние ссылки

  • Структура растрового файла , на digicamsoft.com
  • Введение в DIB (растровые изображения , не зависящие от устройства) на сайте herdsoft.com
  • Класс C ++ простого загрузчика растровых изображений , на сайте kalytta.com (A2R10G10B10 еще не поддерживается)
  • Формат файла BMP, часть 1 Дэвид Чарлэп из журнала программных инструментов доктора Добба (drdobbs.com), март 1995 г.