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

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

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

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

Диаграмма 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, и имеет несколько различных вариантов. Все они содержат поле двойного слова (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 или BI_ALPHABITFIELDS). Следовательно, его смещение - это размер BITMAPFILEHEADER плюс размер заголовка DIB (плюс необязательные 12 байтов для трех битовых масок). Примечание: В Windows CE BITMAPINFOHEADER заголовок может быть использовано с BI_ALPHABITFIELDS [6] вариантом в элементе biCompression.

Число записей в палитре равно 2 n (где n - количество бит на пиксель) или меньшее число, указанное в заголовке (в формате заголовка OS / 2 BITMAPCOREHEADER поддерживается только полноразмерная палитра). [3] [5] В большинстве случаев каждая запись в таблице цветов занимает 4 байта в порядке: синий, зеленый, красный, 0x00 (исключения см. Ниже). Это индексируется в BITMAPINFOHEADER под функцией biBitCount.

Таблица цветов - это блок байтов (таблица), в котором перечислены цвета, используемые изображением. Каждый пиксель в индексированном цветном изображении описывается числом битов (1, 4 или 8), которое является индексом одного цвета, описанного в этой таблице. Целью цветовой палитры в индексированных цветных растровых изображениях является информирование приложения о фактическом цвете, которому соответствует каждое из этих значений индекса. Назначение таблицы цветов в неиндексированных (не палитрах) растровых изображений - перечислить цвета, используемые растровым изображением, для целей оптимизации на устройствах с ограниченными возможностями отображения цвета и облегчить будущее преобразование в различные форматы пикселей и палитру.

Цвета в таблице цветов обычно задаются в формате RGBA32 размером 4 байта для каждой записи . Таблица цветов, используемая с 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 = 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 байта заполнения, Ширина = 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

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

Диаг. 3 - Формат пикселей с альфа-каналом для 16-битного пикселя (в обозначении длины образца RGBAX), фактически созданный Adobe Photoshop [21]
Все возможные форматы пикселей в 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 и других странах, а также тот факт, что этот формат относительно хорошо документирован и не защищен патентами, делают его очень распространенным форматом, который программы обработки изображений из многих операционных систем могут читать. и напишите [ необходима цитата ] . Файлы 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 (Device Independent Bitmaps) на сайте herdsoft.com
  • Класс C ++ простого загрузчика растровых изображений на сайте kalytta.com (A2R10G10B10 еще не поддерживается)
  • Формат файла BMP, часть 1 Дэвид Чарлэп из журнала программных инструментов доктора Добба (drdobbs.com), март 1995 г.