BMP (от англ. Bitmap Picture) — формат хранения растровых изображений, разработанный компанией Microsoft. Файлы формата BMP могут иметь расширения .bmp, .dib и .rle.
Windows Bitmap | |
---|---|
Расширение | .bmp , .dib или .rle |
MIME-тип | image/bmp |
Разработчик | Майкрософт |
Тип формата | растровая графика |
Медиафайлы на Викискладе |
С форматом BMP работает огромное количество программ, так как его поддержка интегрирована в операционные системы Windows и (OS/2). Кроме того, данные этого формата включаются в двоичные файлы ресурсов RES и в PE-файлы.
В данном формате можно хранить только однослойные растры. На каждый пиксель в разных файлах может приходиться разное количество бит (глубина цвета). Microsoft предлагает битности 1, 2, 4, 8, 16, 24, 32, 48 и 64. В битностях 8 и ниже цвет указывается индексом из таблицы цветов (палитры), а при бо́льших — непосредственным значением. Цвет же в любом случае можно задать только в цветовой модели RGB (как при непосредственном указании в пикселе, так и в таблице цветов), но в битностях 16 и 32 можно получить Grayscale с глубиной до 16 и 32 бит, соответственно. Частичная прозрачность реализована альфа-каналом битностей от 16 бит и выше.
В большинстве случаев пиксели хранятся в виде относительно простого двумерного массива. Для битностей 4 и 8 доступно сжатие алгоритмом RLE, которое может уменьшить их размер. Формат BMP также поддерживает встраивание данных в форматах JPEG и PNG. Но последнее скорее больше предназначено не для компактного хранения, а для обхода ограничений архитектуры GDI, которая не предусматривает прямую работу с изображениями отличных от BMP форматов.
В последних версиях формата BMP также появились возможности по управлению цветом. В частности, можно указывать конечные точки, производить гамма-коррекцию и встраивать цветовые профили ICC.
DIB и DDB
При использовании формата DIB (англ. Device Independent Bitmap, аппаратно-независимый растр) программист может получить доступ ко всем элементам структур, описывающих изображение, при помощи обычного указателя. Но эти данные не используются для непосредственного управления экраном, так как они всегда хранятся в системной памяти, а не в специализированной видеопамяти. Формат пикселя в оперативной памяти может отличаться от того формата, который должен заноситься в видеопамять для индикации точки такого же цвета. Например, в DIB-формате может использоваться 24 бита для задания пикселя, а графический адаптер в этот момент может работать в режиме HiColor с цветовой глубиной 16 бит. При этом ярко-красная точка в аппаратно-независимом формате будет задаваться тремя байтами 0000FF16, а в видеопамяти — словом F80016. При копировании картинки на экран система будет тратить дополнительное время на преобразование кодов цвета из 24-битного формата в формат .
Формат DDB (англ. Device Dependent Bitmap, аппаратно-зависимый растр) всегда содержит цветовые коды, совпадающие с кодами видеобуфера, но храниться он может как в системной, так и в видеопамяти. В обоих случаях он содержит только коды цвета в том формате, который обеспечит пересылку изображения из ОЗУ в видеопамять при помощи простого копирования.
Внутреннее строение
Официальную информацию по формату BMP можно найти в MSDN или справке Microsoft Windows SDK (может идти в комплекте с некоторыми IDE). В файле WinGDI.h от компании Microsoft есть все объявления на языке , которые касаются данного формата. В данную статью же не были включены объявления типов, так как от этого она может быть слишком громоздкой. К тому же официальные объявления некоторые разработчики могут посчитать неудобными и поэтому их востребованность сомнительна. Если вам потребуются оригинальные имена констант, структур, типов и их полей, то они все есть в тексте данной статьи.
Максимальный размер неделимых ячеек (исключая поля битовых структур): 32 бита и поэтому формат можно классифицировать как 32-битный. Исключением могут быть 64-битные пиксели, но значения их каналов можно обрабатывать и 16-битными словами. Порядок байт в 16-битных и 32-битных ячейках повсюду от младшего к старшему (little-endian). Целые числа записываются в прямом коде, со знаком — в дополнительном. Если сравнивать с аппаратными архитектурами, то порядок байт и формат чисел соответствует x86.
В данной статье для указания типов используются имена типов WinAPI как в документации Microsoft. Кроме специфических (описаны отдельно в тексте статьи) можно встретить четыре числовых типа:
- BYTE — 8-битное беззнаковое целое.
- WORD — 16-битное беззнаковое целое.
- DWORD — 32-битное беззнаковое целое.
- LONG — 32-битное целое со знаком.
В формате Windows Bitmap под структурами понимается блок с идущими подряд ячейками различного фиксированного размера, у которых есть условные имена (есть во многих языках программирования), а не что-то сложнее (например, поток команд произвольного размера).
У некоторых элементов формата указана версия Windows, начиная с которой он поддерживается. Речь идёт в первую очередь об основных библиотеках WinAPI таких как gdi32.dll, shell32.dll, user32.dll и kernel32.dll. Другие компоненты операционной системы (например, GDI+, .NET, DirectX) могут иметь другие более широкие возможности.
Общая структура
Данные в формате BMP состоят из трёх основных блоков различного размера:
- Заголовок из структуры BITMAPFILEHEADER и блока BITMAPINFO. Последний содержит:
- Информационные поля.
- Битовые маски для извлечения значений цветовых каналов (опциональные).
- Таблица цветов (опциональная).
- Цветовой профиль (опциональный).
- Пиксельные данные.
При хранении в файле все заголовки идут с самого первого байта. Пиксельные данные могут находиться на произвольной позиции в файле (она указывается в поле OffBits структуры BITMAPFILEHEADER), в том числе и в удалении от заголовков. Опциональный цветовой профиль появился в версии 5 и он также может свободно располагаться, но его позиция указывается от начала BITMAPINFO (в поле ProfileData).
В оперативной памяти (например, при взаимодействии с WinAPI-функциями GDI) из заголовков исключается структура BITMAPFILEHEADER. При этом Microsoft рекомендует располагать цветовой профиль сразу за заголовками в едином блоке. Пиксельные данные могут иметь произвольное расположение в памяти и их адрес указывается в параметрах процедур. В любом случае рекомендуется в памяти все блоки содержать по адресам кратным четырём: в заголовках присутствуют 32-битные ячейки, а к пиксельным данным такое требование указано в документации. Это требование справедливо только для оперативной памяти: при хранении в файле его придерживаться не обязательно.
BITMAPFILEHEADER
BITMAPFILEHEADER — 14-байтная структура, которая располагается в самом начале файла. Обратите внимание на то, что с самого начала структуры сбивается выравнивание ячеек. Если для вас оно важно, то в оперативной памяти данный заголовок располагайте по чётным адресам, которые не кратны четырём (тогда 32-битные ячейки попадут на выравненные позиции).
Поз. (hex) | Размер (байты) | Имя | Тип WinAPI | Описание |
---|---|---|---|---|
00 | 2 | bfType | WORD | Отметка для отличия формата от других (сигнатура формата). Может содержать единственное значение 4D4216/424D16 (little-endian/big-endian). |
02 | 4 | bfSize | DWORD | Размер файла в байтах. |
06 | 2 | bfReserved1 | WORD | Зарезервированы и должны содержать ноль. |
08 | 2 | bfReserved2 | WORD | |
0A | 4 | bfOffBits | DWORD | Положение пиксельных данных относительно начала данной структуры (в байтах). |
Сигнатура формата при просмотре содержимого файла текстом в двоичном режиме выглядит как пара ASCII-символов «BM».
BITMAPINFO
BITMAPINFO в файле идёт сразу за BITMAPFILEHEADER. Адрес этого блока в памяти напрямую также передаётся некоторым функциям WinAPI (например, SetDIBitsToDevice или CreateDIBitmap). Кроме этого, этот же блок используется в форматах значков и курсоров Windows, но в данной статье этот момент не рассматривается (см. отдельные описания этих форматов). Данная структура является основной и описательной в формате BMP и поэтому когда просто упомянуто имя поля, то речь идёт о поле в данной структуре.
Блок BITMAPINFO состоит из трёх частей:
- Структура с информационными полями.
- Битовые маски для извлечения значений цветовых каналов (присутствуют не всегда).
- Таблица цветов (присутствует не всегда).
Про битовые маски и таблицу цветов смотрите ниже в отдельных разделах. Здесь далее пойдёт описание структуры с информационными полями.
В момент написания данной статьи структура с информационными полями имела четыре версии: CORE, 3, 4 и 5 (обозначения версий приведены условные в рамках данной статьи для краткости). Для каждой версии Microsoft объявила четыре отдельные структуры с разными именами полей. В данной статье при упоминании поля, которое присутствует в нескольких структурах, берётся общая для всех структур часть в конце имени (например, BitCount вместо bcBitCount, biBitCount, bV4BitCount или bV5BitCount). Версию структуры можно определить по первой 32-битной ячейке (WinAPI-тип DWORD), которая содержит её размер в байтах (беззнаковым целым). Версия CORE отличается от всех своей компактностью и использованием исключительно 16-битных беззнаковых полей. Остальные три содержат идентичные ячейки, к которым в каждой новой версии добавлялись новые.
Ниже представлена обзорная таблица по информационным структурам:
Версия | Размер (байты) | Имя структуры | Версия Windows 9x/NT | Версия Windows CE/Mobile | Примечания |
---|---|---|---|---|---|
CORE | 12 | BITMAPCOREHEADER | 95/NT 3.1 и старше | CE 2.0/Mobile 5.0 и старше | Содержит только ширину, высоту и битность растра. |
3 | 40 | BITMAPINFOHEADER | 95/NT 3.1 и старше | CE 1.0/Mobile 5.0 и старше | Содержит ширину, высоту и битность растра, а также формат пикселей, информацию о цветовой таблице и разрешении. |
4 | 108 | BITMAPV4HEADER | 95/NT 4.0 и старше | не поддерживается | Отдельно выделены маски каналов, добавлена информация о цветовом пространстве и гамме. |
5 | 124 | BITMAPV5HEADER | 98/2000 и старше | не поддерживается | Добавлено указание предпочтительной стратегии отображения и поддержка профилей ICC. |
Из-за идентичности полей в версиях 3, 4 и 5 может показаться, что полем Size можно регулировать количество полей, убирая неиспользуемые. В действительности это не корректно, так как здесь размер играет роль версии (в версии CORE хоть и тоже идентичные поля, но другого размера и типа). Никто не гарантирует, что вам не могут попасться заголовки меньших или больших размеров с другим набором полей. Тем не менее, Adobe Photoshop может при сохранении файлов BMP записывать структуры информационных полей с размерами 52 и 56 байт. По сути это урезанная 4-я версия, которая содержат только битовые маски каналов (56 байт — версия с альфа-каналом).
16-битные информационные поля (версия CORE)
Обратите внимание на то, что здесь поля ширины и высоты содержат беззнаковые целые, в то время как 32-битные структуры хранят значения со знаком.
Позиция в файле (hex) | Позиция в структуре (hex) | Размер (байты) | Имя | Тип WinAPI | Описание |
---|---|---|---|---|---|
0E | 00 | 4 | bcSize | DWORD | Размер данной структуры в байтах, указывающий также на версию структуры (здесь должно быть значение 12). |
12 | 04 | 2 | bcWidth | WORD | Ширина (bcWidth) и высота (bcHeight) растра в пикселях. Указываются целым числом без знака. Значение 0 не документировано. |
14 | 06 | 2 | bcHeight | WORD | |
16 | 08 | 2 | bcPlanes | WORD | В BMP допустимо только значение 1. Это поле используется в значках и курсорах Windows. |
18 | 0A | 2 | bcBitCount | WORD | Количество бит на пиксель (список поддерживаемых смотрите в отдельном разделе ниже). |
32-битные информационные поля (версии 3, 4 и 5)
В таблице ниже поля представлены обзорно. Подробную информацию вы можете найти в разделах далее.
Позиция в файле (hex) | Позиция в структуре (hex) | Размер (байты) | Имя (версии 3/4/5) | Тип WinAPI | Описание |
---|---|---|---|---|---|
0E | 00 | 4 | biSize bV4Size bV5Size | DWORD | Размер данной структуры в байтах, указывающий также на версию структуры (см. таблицу версий выше). |
12 | 04 | 4 | biWidth bV4Width bV5Width | LONG | Ширина растра в пикселях. Указывается целым числом со знаком. Ноль и отрицательные не документированы. |
16 | 08 | 4 | biHeight bV4Height bV5Height | LONG | Целое число со знаком, содержащее два параметра: высота растра в пикселях (абсолютное значение числа) и порядок следования строк в двумерных массивах (знак числа). Нулевое значение не документировано. |
1A | 0C | 2 | biPlanes bV4Planes bV5Planes | WORD | В BMP допустимо только значение 1. Это поле используется в значках и курсорах Windows. |
1C | 0E | 2 | biBitCount bV4BitCount bV5BitCount | WORD | Количество бит на пиксель (список поддерживаемых смотрите в отдельном разделе ниже). |
1E | 10 | 4 | biCompression bV4V4Compression bV5Compression | DWORD | Указывает на способ хранения пикселей (см. в разделе ниже). |
22 | 14 | 4 | biSizeImage bV4SizeImage bV5SizeImage | DWORD | Размер пиксельных данных в байтах. Может быть обнулено если хранение осуществляется двумерным массивом. |
26 | 18 | 4 | biXPelsPerMeter bV4XPelsPerMeter bV5XPelsPerMeter | LONG | Количество пикселей на метр по горизонтали и вертикали (см. раздел «Разрешение изображения» данной статьи). |
2A | 1C | 4 | biYPelsPerMeter bV4YPelsPerMeter bV5YPelsPerMeter | LONG | |
2E | 20 | 4 | biClrUsed bV4ClrUsed bV5ClrUsed | DWORD | Размер таблицы цветов в ячейках. |
32 | 24 | 4 | biClrImportant bV4ClrImportant bV5ClrImportant | DWORD | Количество ячеек от начала таблицы цветов до последней используемой (включая её саму). |
Добавлены в версии 4 | |||||
Позиция в файле (hex) | Позиция в структуре (hex) | Размер (байты) | Имя (версии 4/5) | Тип WinAPI | Описание |
36 | 28 | 4 | bV4RedMask bV5RedMask | DWORD | Битовые маски для извлечения значений каналов: интенсивность красного, зелёного, синего и значение альфа-канала. |
3A | 2C | 4 | bV4GreenMask bV5GreenMask | DWORD | |
3E | 30 | 4 | bV4BlueMask bV5BlueMask | DWORD | |
42 | 34 | 4 | bV4AlphaMask bV5AlphaMask | DWORD | |
46 | 38 | 4 | bV4CSType bV5CSType | DWORD | Вид цветового пространства. |
4A | 3C | 36 | bV4Endpoints bV5Endpoints | CIEXYZTRIPLE | Значение этих четырёх полей берётся во внимание только если поле CSType содержит 0 (LCS_CALIBRATED_RGB). Тогда конечные точки и значения гаммы для трёх цветовых компонент указываются в этих полях. |
6E | 60 | 4 | bV4GammaRed bV5GammaRed | DWORD | |
72 | 64 | 4 | bV4GammaGreen bV5GammaGreen | DWORD | |
76 | 68 | 4 | bV4GammaBlue bV5GammaBlue | DWORD | |
Добавлены в версии 5 | |||||
Позиция в файле (hex) | Позиция в структуре (hex) | Размер (байты) | Имя | Тип WinAPI | Описание |
7A | 6C | 4 | bV5Intent | DWORD | Предпочтения при рендеринге растра. |
7E | 70 | 4 | bV5ProfileData | DWORD | Смещение в байтах цветового профиля от начала BITMAPINFO (см. также раздел «Цветовой профиль» ниже в этой статье). |
82 | 74 | 4 | bV5ProfileSize | DWORD | Если в BMP непосредственно включается цветовой профиль, то здесь указывается его размер в байтах. |
86 | 78 | 4 | bV5Reserved | DWORD | Зарезервировано и должно быть обнулено. |
Битность изображения (поле BitCount)
Поле BitCount содержит количество бит, которое приходится на каждый пиксель. Если там указано отличное от нуля значение, то это и есть реальная битность. Нулевое же содержимое поля BitCount указывается если пиксели хранятся в формате JPEG или PNG. Тогда действительная битность будет определяться уже этими форматами. Битности чисто BMP формата представлены в таблице ниже:
Бит | Байт | BITMAPINFO | RLE | Маски каналов | Поддержка программным обеспечением | ||||
---|---|---|---|---|---|---|---|---|---|
CORE | 3, 4, 5 | Windows 9x и NT | Windows CE и Mobile | и .NET | |||||
1 | ⅛ | Да | Да | Нет | Нет | Да | Да | Да | |
2 | ¼ | Да | Да | Нет | Нет | Нет | Да | Нет | |
4 | ½ | Да | Да | Да | Нет | Да | Да | Да | |
8 | 1 | Да | Да | Да | Нет | Да | Да | Да | |
16 | 2 | Нет | Да | Нет | Да | Да | Да | Да | |
24 | 3 | Да | Да | Нет | Нет | Да | Да | Да | |
32 | 4 | Нет | Да | Нет | Да | Да | Да | Да | |
48 | 6 | Нет | Да | Нет | Нет | Нет | Нет | Да | |
64 | 8 | Нет | Да | Нет | Нет | Нет | Нет | Да |
Примечания к таблице:
1. В колонке «BITMAPINFO» указана поддержка битностей только со стороны Microsoft.
2. Windows CE 1.0 и 1.01 поддерживает только битности 1 и 2.
3. GDI+ версии 1.0 16-битные цветовые каналы умеет только считывать, сразу переводя их в 8-битные.
В битностях 8 и ниже цвет пикселя указывается индексом в таблице цветов, в высших: непосредственным значением в цветовой модели RGB. Альфа-канал опционально может быть добавлен в битностях 16 и 32. В битности 64 он присутствует перманентно.
В таблице представлены только битности, которые документировала корпорация Microsoft. Сам формат не содержит никаких принципиальных ограничений на использование каких-либо не упомянутых здесь битностей.
1-битные BMP-файлы с чисто чёрным (сброшенный бит) и белым (установленный бит) цветами называют монохромными. Такие файлы обычно используются в качестве масок для других растров. Возможно вам постоянно попадались на глаза именно такие 1-битные растры. В действительности формат Windows Bitmap не накладывает никаких ограничений на то, какие цвета будут использоваться для каждого из значений бит.
Вы можете также встретить следующие названия битностей: CGA для двух бит, EGA для четырёх, HiColor (HighColor) для 16 бит, TrueColor для 24 и 32 бит с полупрозрачностью, DeepColor для больших битностей и возможно другие. Эти названия появились в период развития цветных растровых дисплеев и относятся больше к их глубине цвета. К моменту написания данной статьи (2014 год) такие названия уже давно не используются из-за сильного распространения 24-битных устройств (вместо этого просто указывается глубина цвета в битах или их количество). А BMP-файлы в меньшей битности сохраняются в большей степени не для отображения на CGA или EGA-устройствах, а для компактности по сравнению с 24-битными и 32-битными форматами если используется малое количество цветов.
Поле Compression
Для каждой группы битностей используются отдельные ограниченные значения Compression, но в совокупности их значения уникальны. Microsoft документировала следующие значения (в таблице указаны имена констант от этой корпорации):
Значение | Имя константы | Применимо к BitCount | Хранение пикселей | Знак Height | Версия Windows | |
---|---|---|---|---|---|---|
9x/NT | CE | |||||
0 | BI_RGB | любым кроме нуля | двумерный массив | +/− | 95/NT 3.1 | CE 1.0 |
1 | BI_RLE8 | 8 | RLE-кодирование | + | 95/NT 3.1 | (не подд.) |
2 | BI_RLE4 | 4 | RLE-кодирование | + | 95/NT 3.1 | (не подд.) |
3 | BI_BITFIELDS | 16 и 32 | двумерный массив с масками цветовых каналов | +/− | 95/NT 3.1 | CE 2.0 |
4 | BI_JPEG | 0 | во встроенном JPEG-файле | ?/− | 98/2000 | (не подд.) |
5 | BI_PNG | 0 | во встроенном PNG-файле | ?/− | 98/2000 | (не подд.) |
6 | BI_ALPHABITFIELDS | 16 и 32 | двумерный массив с масками цветовых и альфа-канала | +/− | (не подд.) | .NET 4.0 |
Таблица цветов
Таблица цветов является частью блока BITMAPINFO и может использоваться в двух случаях:
- Она обязательно присутствует при битностях 8 и ниже, в которых цвет пикселей задаётся индексом ячейки из неё.
- При битностях 8 и выше, в которых цвет указывается непосредственным значением, таблица присутствует если используется заголовок не CORE-версии, у которого поле ClrUsed содержит ненулевое значение. Здесь она задействуется уже для оптимизации цветов при работе с использующими палитры устройствами (как именно производится оптимизация в документации не сказано).
Позиция таблицы цветов указывается от его начала блока BITMAPINFO. По умолчанию она идёт сразу за информационной структурой (её беззнаковый размер в байтах можно прочитать из первого 32-битного поля). Но между структурой с полями и цветовой таблицей могут идти четырёхбайтные битовые маски для извлечения цветовых каналов (касается только битностей 16 и 32). Они там находятся только если используется информационная структура 3-й версии (Size = 40) и поле Compression содержит 3 (BI_BITFIELDS) или 6 (BI_ALPHABITFIELDS). Тогда к размеру информационных полей нужно прибавить 12 (при значении BI_BITFIELDS) или 16 байт (если указано BI_ALPHABITFIELDS). Получается 6 вариантов расположения таблицы:
Версия заголовка | Позиция (hex) | Примечания | |
---|---|---|---|
В файле | В BITMAPINFO | ||
CORE | 1A | 0C | маски каналов не поддерживаются |
3 | 36 | 28 | Compression не содержит 3 или 6 |
42 | 34 | Compression = 3 (BI_BITFIELDS) | |
46 | 38 | Compression = 6 (BI_ALPHABITFIELDS) | |
4 | 7A | 6C | маски каналов встроены в информационные поля |
5 | 8A | 7B |
Количество ячеек в таблице определяется по полям BitCount и ClrUsed. При битностях 8 и ниже максимальное количество ячеек в таблице принимается за 2битность: 2 в однобитном растре, 4 в двухбитном, 16 в 4-битном и 256 в 8-битном. В данных битностях таблица всегда содержит это максимальное количество ячеек если используется заголовок версии CORE (Size = 12) или если в других версиях поле ClrUsed содержит 0. Во всех остальных случаях, независимо от битности, в таблице находится столько же ячеек, сколько указано в поле ClrUsed.
Сама же таблица представляет собой одномерный массив, который может содержать ячейки трёх типов:
- 32-битная структура RGBQUAD. Применяется если в BITMAPINFO использована информационная структура версии 3, 4 или 5. В самой же структуре RGBQUAD указывается цвет в модели RGB в четырёх байтовых ячейках (все имеют WinAPI-тип BYTE): rgbBlue (синий), rgbGreen (зелёный), rgbRed (красный) и rgbReserved (зарезервирована и должна быть обнулена).
- 24-битная структура RGBTRIPLE. Применяется если BITMAPINFO начинается со структуры BITMAPCOREHEADER. RGBTRIPLE состоит из трёх байтовых ячеек (WinAPI-тип BYTE), в которых указывается цвет в модели RGB: rgbtBlue (синий), rgbtGreen (зелёный) и rgbtRed (красный).
- 16-битные индексы цветов (беззнаковые целые числа) в текущей логической палитре контекста устройства (системные объекты Windows GDI). Этот вид доступен только во время выполнения приложения. Формат BMP не поддерживает явное указание, что используется такая таблица и поэтому приложение само извещает WinAPI-функции об этом в специальных параметрах (как правило константой DIB_PAL_COLORS).
Во всей таблице могут быть задействованы не все ячейки и в поле ClrImportant помещается количество ячеек от начала таблицы до последней используемой (включая её саму). Содержимое 0 поля ClrImportant указывает на то, что используется вся таблица. Задействованные ячейки лучше размещать в самом начале таблицы и рекомендуется при этом отсортировать их по убыванию степени важности (на случай если придётся уменьшить их количество).
Маски для извлечения значений цветовых каналов
Если битность изображения 16 или 32, то могут быть указаны 32-битные маски для извлечения цветовых каналов. Это связано с тем, что 16 не кратно трём и поэтому биты могут быть распределены разными способами. В 32-битных изображениях из-за удобства используют 8-битные каналы и поэтому поддержка для них может показаться избыточной. В действительности здесь маска даёт возможность включить/отключить альфа-канал или установить удобный вам порядок следования компонент, а не только регулировать их разрешение. При применении масок ячейка пикселя считывается целиком как соответствующее машинное слово в little-endian.
Наличие битовых масок зависит от версии информационных полей структуры BITMAPINFO и поля Compression в ней. Для версии CORE произвольные маски указать нельзя, так как там отсутствует поле Compression и отдельные поля масок. В остальных версиях цветовые маски задействуются если Compression содержит 3 (BI_BITFIELDS). Маска альфа-канала используется всегда в версиях 4 и 5. Так как Windows CE не поддерживает эти две версии, в которых для неё есть специальное поле, для третьей версии было введено значение 6 (BI_ALPHABITFIELDS) поля Compression, которое добавляет сразу цветовые маски и маску альфа-канала (поддерживается начиная с Windows CE .NET 4.0).
Положение битовых масок фиксировано независимо от версии заголовка: 36h во всём файле или 28h от начала блока BITMAPINFO. В версиях 4 и 5 на этом месте располагаются предназначенные специально для них поля. В версии же 3 битовые маски должны располагаться сразу за информационными полями и таким образом они точно попадают на позиции соответствующих полей в старших версиях. Обратите внимание на то, что в третьей версии при наличии масок сдвигается таблица цветов на 12 или 16 байт вперёд, располагаясь сразу за ними. 4-байтные маски цветов следуют в порядке красная, зелёная, синяя. Маска альфа-канала располагается уже за ними.
В документации Microsoft к битовым маскам применяется только одно обязательное требование: каждая маска должна быть непрерывной. Про случай пересечения масок там сказано, что желательно этого не делать. Microsoft также говорит о том, что не обязательно задействовать все биты пикселя. Какие-либо требования к содержимому неиспользуемых бит отсутствуют.
Обратите внимание на то, что никто не гарантирует, что могут быть использованы маски шире 8 бит. И ничего не сказано про случай, когда у какого-либо канала будет нулевая маска (например, когда он действительно не используется). Здесь возможна ситуация когда нулевые маски будут у всех компонентов и останется один альфа-канал (который при этом может занять все биты). Нулевую маску цветового канала можно трактовать двумя способами: его значение принимается за ноль или же при прорисовке пиксели этого канала не затрагиваются. Если взять первый вариант интерпретации с единственным альфа-каналом, то альфа-канал по сути будет задавать степень зачернения пикселя. Кроме неопределённых вариантов есть также и интересный. Так как пересечения не запрещены, то можно все каналы выставить на одну позицию и тем самым получить Grayscale.
Некоторое ПО имеет ограниченный набор поддерживаемых битовых масок. В таблице ниже приведены доступные варианты в таких ограниченных средах:
Битность | * | Значения масок (hex) | Поддержка в ПО | |||||
---|---|---|---|---|---|---|---|---|
Красный | Зелёный | Синий | Альфа | Неиспользуемые | Windows 9x | GDI+ и .NET | ||
16 | (a) | 7C00 | 03E0 | 001F | 0000 | 8000 | Да | Да |
7C00 | 03E0 | 001F | 8000 | 0000 | Нет | Да | ||
F800 | 07E0 | 001F | 0000 | 0000 | Да | Да | ||
(b) | FFFF | FFFF | FFFF | 0000 | 0000 | Нет | Да | |
32 | (a) | 00FF:0000 | 0000:FF00 | 0000:00FF | 0000:0000 | FF00:0000 | Да | Да |
00FF:0000 | 0000:FF00 | 0000:00FF | FF00:0000 | 0000:0000 | Нет | Да |
Примечания к таблице:
(a) Эти наборы используются по умолчанию в битностях 16 и 32, если маски для извлечения цветов не заданы.
(b) Данный набор масок по своей сути реализует 16-битный Grayscale.
Пиксельные данные
В файле положение пиксельных данных можно узнать из поля OffBits структуры BITMAPFILEHEADER. Во время выполнения приложение хранит адрес пиксельных данных там, где удобней. В документации Microsoft также упоминаются так называемые упакованные (англ. packed) битмапы, которые указываются одним адресом блока BITMAPINFO. У таких битмапов пиксельные данные следуют сразу за заголовком (включая помимо информационных полей битовые маски и таблицу цветов).
Размер пиксельных данных в байтах записывается в поле SizeImage структуры BITMAPINFO. Туда записываются именно «сырой» размер того непрерывного блока, который содержит данные для формирования пикселей (независимо от формата), а не какой-нибудь распакованный. По умолчанию это поле обязательно должно содержать актуальное значение, так как по нему можно точно узнать сколько именно байт нужно считать из файла для получения пикселей. Тем не менее, допустимо содержать в этом поле ноль при хранении пикселей двумерными массивами (когда поле Compression содержит значение 0 (BI_RGB), 3 (BI_BITFIELDS) или 6 (BI_ALPHABITFIELDS)). Тогда размер пикселей при необходимости можно относительно быстро рассчитать исходя из битности, ширины и высоты растра.
В формате Windows Bitmap доступно три способа хранения пикселей (см. также раздел «Поле Compression» данной статьи):
- Двумерный массив.
- RLE (только для битностей 4 и 8).
- В форматах JPEG или PNG.
В подразделах далее отдельно описан каждый из них.
Указание цвета и значения альфа-канала
Для указания цвета при хранении в формате BMP независимо от способа задания используются только беззнаковые целые числа. Сам же цвет пикселя может задаваться двумя способами:
- Индексом в таблице цветов (при битностях 8 и ниже).
- Непосредственным значением в цветовой модели RGB (при битностях выше 8).
Второй целесообразно использовать когда набор цветов довольно большой или непредсказуем (например, во время обработки изображения). Первый же способ обеспечивает как компактную компоновку при малом наборе цветов, так и некоторое удобство в управлении используемыми цветами (достаточно изменить значение цвета в палитре). В самой таблице цветов указываются или 16-битные беззнаковые индексы в системной палитре (см. раздел «Таблица цветов» в данной статье), или же в RGB как в пикселе, но исключительно 8-битными значениями каналов.
Индекс в таблице цветов — это номер ячейки в ней от начала таблицы (используется непрерывная нумерация начиная с нуля). Для каждой битности максимальный индекс принципиально ограничен значением 2битность − 1. В действительности же он ограничен ещё и количеством элементов в таблице (подробности в разделе «Таблица цветов» данной статьи). Microsoft не документировала поведение в случае когда указывается индекс за пределами таблицы, но GDI в этом случае берёт чёрный цвет.
В битностях выше 8 цвет пикселя указывается непосредственно в цветовой модели RGB: отдельно указывается уровень красного цвета, зелёного и синего. Нулевое значение любого из каналов означает полное отсутствие соответствующего оттенка, а максимальное: полное его присутствие. Разрешение же значений каналов переменное и в каждой битности оно своё (конкретные значения смотрите в разделе про хранение пикселей в двумерном массиве этой статьи). При этом в битностях 16 и 32 может быть задано не только произвольное разрешение, но и индивидуальное для каждого канала (например, 5 бит для красной и синей, но 6 бит для зелёной). Несмотря на большое количество вариантов задания разрешения значений, в документации Microsoft не сказано как производить изменение разрешения значения. Из-за этого у разных производителей программного обеспечения могут получаться различные результаты при смене битности.
При непосредственном задании цвета пикселя кроме значений RGB формат Windows Bitmap опционально позволяет ещё задать значения альфа-канала. В плане битности и кодировании значений он идентичен цветовым каналам: у него произвольная битность и используются беззнаковые целые. Что же касается сопоставления значений, то ноль соответствует полной прозрачности, а максимальное доступное число — полной заполненности.
Двумерный массив
В двумерном массиве можно хранить пиксели любой битности. При таком способе хранения поле Compression содержит значение 0 (BI_RGB), 3 (BI_BITFIELDS) или 6 (BI_ALPHABITFIELDS). Если используется заголовок версии CORE, то пиксели в любом случае хранятся только двумерным массивом.
В данной компоновке пиксели растра записываются однопиксельными горизонтальными полосками, которые Microsoft в своей документации часто называет «scans» (в русском языке наиболее близкое слово: строки). В памяти эти ряды записываются по-порядку, но при положительном Height: начиная с самого нижнего (англ. bottom-up bitmap), а при отрицательном: с самого верхнего (англ. top-down bitmap). Внутри каждого горизонтального ряда пиксели записываются строго только от левого к правому. Пиксели меньше 8 бит размещаются в байтах, заполняя биты от старших к младшим, в результате чего шестнадцатиричные/двоичные числовые значения пикселей более похожи на выводимое изображение. Если битность 16 или 32, то обработка осуществляется цельными машинными словами аналогичного размера с порядком бит от младшего к старшему (little-endian). Ряды, независимо от размера ячеек, обязательно должны дополняться нулями до кратного четырём байтам размера. Из-за этого, при некратной ширине изображения, в конце рядов могут оказываться неиспользуемые биты или целые байты. Но благодаря гарантированной кратности размера ряда, обработку можно производить 8-, 16- или 32-битными машинными словами, по выбору. И у Microsoft ещё прослеживается следующая тенденция в битностях больше 8: компонент Blue (синий цвет) размещается в младших битах/первых байтах, Green (зелёный) в последующих, а Red (красный) старше/дальше всех, и если есть альфа-канал, то он находится в самых старших битах/последних байтах.
Диаграмма ниже отображает расположение пикселей в битностях меньше 8:
Биты | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1 бит | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
2 бита | 0 | 1 | 2 | 3 | ||||
4 бита | 0 | 1 |
В битностях 16 и 32 пиксели обрабатываются машинными словами аналогичного размера (предполагается порядок байт little-endian), которым применяются битовые маски каналов. Если индивидуальные битовые маски не заданы, то структура будет следующая. При 16 бит на каждый канал отводится по 5 бит. Синий располагается в младших битах (маска 001F16), зелёный на позиции 5 (маска 03E016), красный: начиная с 10-го бита (маска 7C0016), а старший оставшийся бит 15 не используется. Если используется битность 32, то по умолчанию на каждый канал отводится уже по байту (8 бит). Компоненты располагаются аналогично: синий в младших битах (маска 0000:00FF16), зелёный начиная с бита 8 (маска 0000:FF0016), красный начинается с бита 16 (маска 00FF:000016), а старший байт не используется (он используется в качестве альфа-канала только если прямо это показать). Так как предполагается чтение в порядке байта little-endian, то если читать значения из памяти по-байтово, они будут располагать в таком же порядке (синий будет идти первым).
При битности 24 на каждый канал приходится по байту, а в битностях 48 и 64: по 16-битному машинному слову. Во всех трёх случаях в памяти цветовые компоненты идут в порядке: синий, зелёный, красный. В 64-битных BMP за цветами дополнительно следует 16-битный альфа-канал. Если захотите 64-битный пиксель обработать цельным машинным словом, то в little-endian синий окажется в младших 16 битах, а альфа-канал: в старших. Зелёный, соответственно, будет рядом к красным, а синий — рядом с альфа. И можно заметить что в 24 битах формат пикселя соответствует структуре RGBTRIPLE из таблицы цветов.
RLE
Применение RLE компанией Microsoft документировано только для битностей 4 и 8. При её использовании в BITMAPINFO поле Compression должно содержать 2 (BI_RLE4) при битности 4 или 1 (BI_RLE8) с восьмибитными пикселями. Высота растра при этом должна быть указана положительным числом.
В формате Windows Bitmap RLE-кодирование можно сравнить с прорисовкой простыми командами. Прорисовка начинается с левого нижнего пикселя (будьте внимательней: в растрах в целом привычней может быть верхний левый) и осуществляется вправо и вверх. Пиксели за пределами размера растра не прорисовываются (об этом в документации не сказано, но GDI проявляет такое поведение). Инструкции RLE позволяют прерывать прорисовку горизонтали, всего изображения, а также перемещать курсор прорисовки на другую позицию. В результате некоторые пиксели могут оказаться не зарисованными. Документация явно не предусматривает цвета для незарисованных пикселей, в результате чего трактовка может варьироваться: пропущенные пиксели либо остаются прозрачными, либо приобретают цвет с индексом 0. Если делать первое допущение, то можно говорить о том, что 4- и 8-битные режимы благодаря RLE косвенно поддерживают прозрачность, но такое поведение не гарантировано.
Формирование изображения при RLE-кодировании осуществляется командами. Каждая команда обязательно должна начинаться с чётного адреса (выравнена на 16-битную границу). Существует пять команд, которые определяются парой байт:
Байт 1 (hex) | Байт 2 (hex) | Описание |
---|---|---|
01..FF | 00..FF | Начиная с текущей позиции и далее вправо прорисовать столько пикселей, сколько указано в первом байте. Значения для пикселей берутся из второго байта. В 8-битных BMP весь байт целиком является значением. В 4-битных из него по-очереди берётся сначала старший, а потом младший ниббл (четвёрка бит). |
00 | 00 | Переместить курсор в начало (самое лево) следующей (верхней) горизонтали. |
00 | 01 | Прекратить прорисовку (достигнут конец). |
00 | 02 | Переместить курсор вправо и вверх на указанные в следующих далее двух байтах значения. В первом следующем байте содержится значение для горизонтального сдвига, а в следующем — для вертикального. Оба значения: целые беззнаковые числа (влево и вниз сдвинуть нельзя). |
00 | 03..FF | С текущей позиции и далее вправо зарисовать пиксели значениями, которые идут после этой пары байт. Во втором байте команды содержится количество пикселей, которое нужно закрасить (именно пикселей, а не байт). В 8-битном растре берётся поток байт как есть. В 4-битном считывается уже нибблы: старшие 4 бита из байта для первого пикселя, младшие 4 бита — для следующего, и так из последующих байт. Данный поток может закончиться нечётным количеством байт, а команды требуют 16-битного выравнивания. Если это произошло, то дописывается дополнительный байт (его содержимое значения не имеет). |
Когда достигается правый край горизонтали, то на следующую перевод не производится. Поэтому нужно специально вставлять команду окончания ряда. И как видно из таблицы, набор команд не позволяют двигаться вниз или вернуться назад в горизонтали. Поэтому можно прекращать прорисовку если будет достигнут верхний край.
Встраивание данных в форматах JPEG и PNG
Начиная с версий Windows 98/ME и 2000/XP системные функции позволяют хранить пиксели в форматах JPEG и PNG. Про степень поддержки этих двух форматов системой ничего не известно.
Для встраивания JPEG или PNG нужно в BITMAPINFO обнулить поле BitCount, а в Compression указать значение 4 (BI_JPEG) или 5 (PI_PNG). Значение поля SizeImage в данном случае будет равно размеру JPEG или PNG-файла, который встраивается на место пиксельных данных как есть. Ширина же с высотой в заголовке указываются уже для раскодированного изображения. Про знак поля Height именно для этого случая в документации напрямую ничего не сказано, но судя по всему нужно записывать отрицательное значение.
Разрешение изображения
Для сопоставления безразмерных пикселей с материальными размерами используются поля XPelsPerMeter и YPelsPerMeter. В этих полях целым числом указывается сколько в данном изображении пикселей приходится на один линейный метр, отдельно по горизонтали (XPelsPerMeter) и вертикали (YPelsPerMeter). Microsoft объявила эти два поля числовым типом со знаком, но в документации ничего не сказано про отрицательные значения. Про значение ноль также ничего не сказано, но логичней его принимать за неопределённое разрешение, когда оно неизвестно или не имеет значения.
Разрешение часто указывается с привязкой не к метрическим размерностям, а в точках на дюйм (DPI/PPI). Для перевода туда и обратно дюйм принимается равным 25,4 мм (английский дюйм). Математические формулы для перевода пиксели/дюйм (PPI) в пиксели/метр (PPM) и наоборот:
Если интересует точный целочисленный перевод то выходят следующие выражения:
PPM = (PPI * 5000 + 64) / 127
PPI = (PPM * 127 + 2500) / 5000
После них округление будет произведено к ближайшему целому. Если хотите округление вниз, то не прибавляйте половину делителя. Если хотите вверх, то прибавляйте уменьшенный на единицу делитель.
Ниже представлены заранее вычисленные значения PPM для некоторых PPI/DPI:
- 96 ppi ≈ 3780 ppm (для мониторов у Microsoft)
- 72 ppi ≈ 2835 ppm (Apple для мониторов)
- 150 dpi ≈ 5906 ppm
- 300 dpi ≈ 11811 ppm
- 600 dpi ≈ 23622 ppm
Цветовое пространство
В информационных полях основным полем задающим цветовое пространство является поле CSType. Допустимые его значения приведены в таблице ниже:
Значение | Версия BITMAPINFO | Имя константы | Описание | |
---|---|---|---|---|
Hex | Текст | |||
0 | (нет) | 4 | LCS_CALIBRATED_RGB | Корректировка исходя из значений Endpoints, GammaRed, GammaGreen и GammaBlue. |
73524742 | 'sRGB' | 4 | LCS_sRGB | Используется цветовое пространство sRGB. |
57696E20 | 'Win ' | 4 | LCS_WINDOWS_COLOR_SPACE | Системное пространство по умолчанию (sRGB). |
4C494E4B | 'LINK' | 5 | PROFILE_LINKED | Цветовой профиль в другом файле. |
4D424544 | 'MBED' | 5 | PROFILE_EMBEDDED | Включённый в данный файл цветовой профиль. |
Microsoft объявила значения констант не числовыми значениями, а текстовыми из четырёх символов. В данном случае коды символов формируют байты 32-битного значения (ASCII-код самого правого символа является младшим байтом, код самого левого — старшим). При просмотре двоичного содержимого файла в виде текста такие значения в кодировке ASCII будут отображаться задом-наперёд (например, «KNIL», а не «LINK»).
Конечные точки и значение гаммы
Формат Windows Bitmap позволяет производить цветокоррекцию указанием конечных точек для красного, зелёного и синего цветов, а также значений гаммы. Для этого поле CSType должно содержать значение 0 (LCS_CALIBRATED_RGB). Корректирующие же значения записываются в поля Endpoints, GammaRed, GammaGreen и GammaBlue (при других значениях CSType эти четыре поля игнорируются).
36-байтное поле EndPoints является структурой CIEXYZTRIPLE, которая состоит из трёх полей ciexyzRed (конечная точка красного), ciexyzGreen (точка зелёного) и ciexyzBlue (синяя). Эти три поля в свою очередь также являются структурами CIEXYZ с тремя полями ciexyzX, ciexyzY и ciexyzZ типа FXPT2DOT30. PXPT2DOT30 — это 32-битное беззнаковое число с фиксированной запятой, у которого 2 старших бита отводятся под целую часть, а 30 младших — под дробную.
Значение гаммы записывается в соответствующие поля для каждого цветового канала отдельно: GammaRed (красный), GammaGreen (зелёный) и GammaBlue (синий). В объявлении информационных структур Microsoft указала у данных полей тип DWORD. В это же время в файле WinGDI.h есть более подходящее объявление типа FXPT16DOT16 (на основе типа long), который представляет собой 32-битное беззнаковое число с дробной частью в младших 16 битах и целой — в 16 старших. Следует отметить, что в MSDN на страницах про структуры BITMAPV4HEADER и BITMAPV5HEADER только это и сказано. В статье же про структуру LOGCOLORSPACE сказано, что у неё в аналогичных полях должны быть обнулены старший и младший байт (по сути вместо формата 16.16 используется формат 8.8, который располагается в середине 32-битной ячейки).
Ниже приведены значения указанных выше четырёх полей в соответствии с цветовым пространством sRGB:
Поле | Значение | |
---|---|---|
Дробное | Hex | |
EndPoints.ciexyzRed.ciexyzX | 0,64 | 28F5C28F |
EndPoints.ciexyzRed.ciexyzY | 0,33 | 151EB852 |
EndPoints.ciexyzRed.ciexyzZ | 0,03 | 01EB851F |
EndPoints.ciexyzGreen.ciexyzX | 0,30 | 13333333 |
EndPoints.ciexyzGreen.ciexyzY | 0,60 | 26666666 |
EndPoints.ciexyzGreen.ciexyzZ | 0,10 | 06666666 |
EndPoints.ciexyzBlue.ciexyzX | 0,15 | 0999999A |
EndPoints.ciexyzBlue.ciexyzY | 0,06 | 03D70A3D |
EndPoints.ciexyzBlue.ciexyzZ | 0,79 | 328F5C29 |
GammaRed GammaGreen GammaBlue | 2,20 | 0002199A |
Цветовой профиль
В файле BMP при необходимости может быть указан цветовой профиль как непосредственным включением, так и ссылкой на другой файл. Профили появились в пятой версии BMP, и пока только здесь есть специальные для них поля. Поддерживаются же цветовые профили только в формате ICC.
При использовании цветовых профилей в первую очередь нужно указать следующие значения поля CSType:
- 4C494E4B16 (PROFILE_LINKED) — если используется профиль в другом файле.
- 4D42454416 (PROFILE_EMBEDDED) — если профиль непосредственно встраивается в BMP.
В любом случае в поле ProfileData указывается смещение профиля в байтах от начала блока BITMAPINFO. Если профиль встроенный, то в ProfileSize нужно указать его размер в байтах (если он подключаемый, то это поле должно быть обнулено). Независимо от варианта, Microsoft рекомендует размещать профиль при хранении в файле за пиксельными данными, а в оперативной памяти при взаимодействии с WinAPI-функциями: сразу за заголовком.
Формат ICC в своём заголовке использует преимущественно 32-битные или кратные этому размеру ячейки. Исходя из этого, если профиль непосредственно включается в BMP, то в оперативной памяти его рекомендуется хранить по кратному четырём байтам адресу.
Когда профиль внешний, то вместо его содержимого в BMP размещается текстовая строка с путём к файлу. Он обязательно должен быть в однобайтовой кодировке Windows 1252 (стандартная кодировка для западноевропейских языков) и заканчиваться нулевым байтом. Про разделители компонентов пути в документации ничего не сказано и поэтому скорее всего можно использовать как левые слэши «\», так и «правые» «/». Путь же может быть как относительным, так и полным и сетевым. И так как в указании пути используется однобайтовая кодировка, то эту строку в оперативной памяти выравнивать не обязательно.
Предпочтения при рендеринге
Предпочтения при рендеринге (англ. rendering intents) были введены Международным концорциумом по цвету (International Color Consortium) и определяют приоритеты в случае когда при переходе из цветового подпространства, поддерживаемого одним устройством (англ. gamut), в подпространство другого, в изображении использованы цвета, отсутствующие в целевом. Также есть определение от ICC, которое определяется предпочтения при рендеринге как стиль сопоставления цветовых значений из одного описателя изображения в другое (оригинал на английском языке: «style of mapping colour values from one image description to another»). Корпорация Microsoft включила в формат BMP специальное поле Intent, которое может принимать значения полностью по спецификации ICC. Поэтому за подробной информации обращайтесь к документации консорциума, последнюю версию которой можно скачать с сайта color.org. У Microsoft же эти предпочтения коротко описаны в статье «Rendering Intents» на MSDN.
Предпочтение указывается в поле Intent блока BITMAPINFO и доступны только с 5-й версией информационных полей. Значения же могут быть следующими:
Значение | Имя константы для BMP | Название ICC | Название Microsoft | Константа из файла Icm.h | Константа для DEVMODE |
---|---|---|---|---|---|
1 | LCS_GM_BUSINESS | saturation | Graphic | INTENT_SATURATION (2) | DMICM_SATURATE (1) |
2 | LCS_GM_GRAPHICS | media-relative colorimetric | Proof | INTENT_RELATIVE_COLORIMETRIC (1) | DMICM_COLORIMETRIC (3) |
4 | LCS_GM_IMAGES | perceptual | Picture | INTENT_PERCEPTUAL (0) | DMICM_CONTRAST (2) |
8 | LCS_GM_ABS_COLORIMETRIC | ICC-absolute colorimetric (relative colometric) | Match | INTENT_ABSOLUTE_COLORIMETRIC (3) | DMICM_ABS_COLORIMETRIC (4) |
Microsoft для данной характеристики объявила как минимум три набора констант, которые отличаются своими значениями и используются в разных местах. Здесь они приведены на случай если вам нужно будет быстро их сопоставить. Значения констант с префиксом «INTENT_» полностью совпадают с теми значениями, которые используются в файлах профилей ICC. Константы с префиксом «DMICM_» объявлены в файле WinGDI.h для структуры DEVMODE. Константы «LCS_GM_», которые используются в BMP, объявлены там же и предназначены в первую очередь для структуры LOGCOLORSPACE. Есть также названия для свойств принтеров. Они аналогичны тем, что в колонке «Название Microsoft», но с «Graphics» и «Pictures».
За значение по умолчанию, которое в первую очередь подходит для фотографий и картинок, можно принимать 4 (LCS_GM_IMAGES). В таком качестве его рекомендует как Microsoft, так и ICC.
Пример программы на C
Следующая программа открывает 24 битный BMP файл в окне XWindow, глубина цвета должна составлять 32 бита, на меньшей цветопередаче не работает, так как это усложняет пример:
/* Компилируется строкой: cc -o xtest xtest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lm */ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> #include <X11/keysym.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <math.h> #include "bitmap.h" /* Здесь определения заголовков BMP как было описано выше в этой статье (структуры должны быть упакованы на 2 байта!) */ static XImage *CreateImageFromBuffer(Display*, unsigned char *, int, int); main(int argc, char *argv[]) { Display *dis; Window win;/* Наше окно */ XEvent event;/* События */ GC gc;/* Графический контекст */ XImage *image; int n, width, height, fd, size; unsigned char *data; BITMAPFILEHEADER bmp; BITMAPINFOHEADER inf; char* buf; if (argc < 2) { perror("use: xtest file.bmp\n"); exit(1); } if ((fd = open(argv[1], O_RDONLY)) == -1) { printf("Error open bitmap\n"); exit(1); } read(fd, &bmp, sizeof(BITMAPFILEHEADER)); read(fd, &inf,sizeof(BITMAPINFOHEADER)); width = inf.biWidth; height = inf.biHeight; if ((dis = XOpenDisplay(getenv("DISPLAY"))) == NULL) { printf("Can't connect X server:%s\n", strerror(errno)); exit(1); } win = XCreateSimpleWindow(dis, RootWindow(dis, DefaultScreen(dis)), 0, 0, width, height, 5, BlackPixel(dis, DefaultScreen(dis)), WhitePixel(dis, DefaultScreen(dis))); XSetStandardProperties(dis, win, argv[1], argv[0], None, argv, argc, NULL); gc = DefaultGC(dis, DefaultScreen(dis)); /* Иногда в структуре это место не заполнено */ if(inf.biSizeImage == 0) { /* Вычислим размер */ size = width * 3 + width % 4; size = size * height; } else { size = inf.biSizeImage; } buf = malloc(size); if(buf == NULL) { perror("malloc"); exit(1); } printf("size =%d байтов выделено\n", size); /* Сместимся на начало самого изображения */ lseek(fd, bmp.bfOffBits, SEEK_SET); /* Читаем в буфер */ n = read(fd, buf, size); printf("size =%d байт прочитано\n", n); image = CreateImageFromBuffer(dis, buf, width, height); /* Удалим буфер - он нам больше не нужен */ free(buf); XMapWindow(dis, win); XSelectInput(dis, win, ExposureMask | KeyPressMask); while (1) { XNextEvent(dis, &event); if (event.xany.window == win) { switch (event.type) { case Expose: XPutImage(dis, win, gc, image, 0, 0, 0, 0, image->width, image->height); break; case KeyPress: if (XLookupKeysym(&event.xkey, 0) == XK_q) { XDestroyImage(image); XCloseDisplay(dis); close(fd); exit(EXIT_SUCCESS); } break; default: break; } } } } /* Создает Ximage из файла BMP, так как изображение BMP хранится первернутым * и зеркальным-в цикле это исправляется */ XImage *CreateImageFromBuffer(Display * dis, unsigned char *buf, int width, int height) { int depth, screen; XImage *img = NULL; int i, j; int numBmpBytes; size_t numImgBytes; int32_t *imgBuf; int ind = 0; int line; int temp; int ih, iw; /* Номера строки и столбца для отражения */ int new_ind; /* Новый индекс */ screen = DefaultScreen(dis); depth = DefaultDepth(dis, screen); temp = width * 3; line = temp + width % 4; /* Длина строки с учетом выравнивания */ numImgBytes = (4 * (width * height)); imgBuf = malloc(numImgBytes); /* Размер, отведенный на BMP в файле с учетом выравнивания */ numBmpBytes = line * height; for (i = 0; i < numBmpBytes; i++) { unsigned int r, g, b; /* Пропускаем padding */ if (i >= temp && (i % line) >= temp) continue; b = buf[i]; i++; g = buf[i]; i++; r = buf[i]; /* Вычисляем новый индекс для отражения по вертикали */ iw = ind % width; ih = ind / width; new_ind = iw + (height - ih - 1) * width; imgBuf[new_ind] = (r | g << 8 | b << 16) << 8; ind++; } img = XCreateImage(dis, CopyFromParent, depth, ZPixmap, 0, (char *) imgBuf, width, height, 32, 0); XInitImage(img); /* Порядок битов и байтов на PC должен быть таким */ img->byte_order = MSBFirst; img->bitmap_bit_order = MSBFirst; return img; }
См. также
- ICO (формат файлов) — родственный формат от Microsoft для хранения значков и курсоров мыши.
Примечания
- http://fileformats.archiveteam.org/wiki/BMP
- https://www.iana.org/assignments/media-types/image/bmp
- Leonard S. Windows Image Media Types (англ.) — IETF, 2016. — 12 p. — doi:10.17487/RFC7903
- http://www.digitalpreservation.gov/formats/fdd/fdd000189.shtml
- https://msdn.microsoft.com/en-us/library/dd183391.aspx
- Евченко А. И. OpenGL и DirectX. Программирование графики (Для профессионалов), 2006 г. С. 183.
- См. раздел «Remarks» статьи «BITMAPV5HEADER structure от 21 марта 2014 на Wayback Machine» на MSDN.
- См. раздел «Remarks» в статье «BITMAPINFO structure от 27 февраля 2014 на Wayback Machine» на MSDN.
- См. статью «Bitmap Header Types от 22 сентября 2014 на Wayback Machine» в MSDN.
- Информация о версиях взята из справки по Microsoft Windows SDK, идущая в комплекте с Microsoft Visual Studio 2008 и Embarcadero RAD Studio 2010 (раздел «Requirements» в статьях про данные структуры).
- См. разделы «Requirements» в статьях «BITMAPCOREHEADER от 16 сентября 2014 на Wayback Machine» и «BITMAPINFOHEADER от 19 апреля 2014 на Wayback Machine» применительно к Windows Mobile 6.5 на MSDN.
- Имя поля «bV4V4Compression» с удвоенным «V4» указано в документациях и объявлении структуры в файле WinGDI.h (смотрите, например, «BITMAPV4HEADER structure от 11 октября 2013 на Wayback Machine» на MSDN.).
- Microsoft объявила поля Gamma* с типом DWORD, но при этом в GDI есть специальный для таких полей тип FXPT16DOT16.
- См. раздел «Remarks» в статье BITMAPINFOHEADER от 19 апреля 2014 на Wayback Machine (рубрика «Windows Mobile 6.5») на MSDN.
- См. раздел «Remarks» в статье «Image Pixel Format Constants от 4 мая 2014 на Wayback Machine» (рубрика «GDI+») на MSDN.
- В MSDN в самом начале раздела «Remarks» страницы структуры BITMAPV5HEADER от 11 октября 2013 на Wayback Machine есть предложение «If bV5Height is negative, indicating a top-down DIB, bV5Compression must be either BI_RGB or BI_BITFIELDS.» (перевод: «Если bV5Height отрицательный, обозначая DIB вида „сверху вниз“, то bV5Compression должен быть либо BI_RGB, либо BI_BITFIELDS»). Здесь возможно не уточнили, что это касается только RLE-кодирования, так как в одном из примеров прорисовки JPEG-растра указывается именно отрицательная высота (ищите строку «bmi.bmiHeader.biHeight» в статье «Testing a Printer for JPEG or PNG Support от 14 ноября 2013 на Wayback Machine» на MSDN).
- Будьте внимательны. В MSDN в статье «BITMAPINFOHEADER от 19 апреля 2014 на Wayback Machine» для Windows Mobile 6.5 в описании к полю biClrUsed есть предложение «If biBitCount equals 16 or 32, the optimal color palette starts immediately following the three DWORD masks.» (перевод: «Если biBitCount равно 16 или 32, то оптимальная цветовая палитра начинается следуя сразу за тремя DWORD-масками»). В этой же статье выше, в описании к полю biCompression сказано «Specifies that the bitmap is not compressed and that the color table consists of three DWORD color masks…» и ниже аналогичное с «consists of four DWORD color masks» (переводы: «Указывает, что битмап не сжат и что таблица цветов состоит из трёх цветовых DWORD-масок» и «состоит из четырёх цветовых DWORD-масок»). Аналогичная информация содержится в статье «BITMAPINFOHEADER structure от 9 февраля 2014 на Wayback Machine» для Windows 9x/NT. Всё это можно интерпретировать так, что в битности 16 и 32 за информационными полями (структурой BITMAPINFOHEADER) обязательно присутствуют три 32-битных маски для извлечения значений цветовых каналов. При этом если Compression содержит 3 (BI_BITFIELDS) или 6 (BI_ALPHABITFIELDS), то за ними добавляется ещё три или четыре аналогичных маски, которые в свою очередь занимают таблицу цветов делая невозможным использование 16-битных индексов оптимальных цветов в логической палитре (возможно при этом в поле biClrUsed нужно записать значение 6 или 8, а в biClrImportant обязательно 0, чтобы дополнительные маски случайно не обработались как индексы в палитре).
В действительности всё несколько иначе. - В документации MSDN на странице «Bitmap Header Types от 22 сентября 2014 на Wayback Machine» есть предложение «Bitmaps that are 1, 4, or 8 bpp must have a color table with a maximum size based on the bpp.» (перевод: «Битмапы с битностью 1, 4 или 8 должны содержать таблицу цветов с максимальным соответствующим битности размером.»). Это явно ошибка и писавший применил условия структуры CORE, у которой действительно должен быть максимум (см. раздел «Remarks» в статье «BITMAPCOREINFO structure от 3 мая 2015 на Wayback Machine»), ко всем остальным версиям структур. В другой статье «BITMAPINFO structure от 24 июня 2014 на Wayback Machine» про таблицу цветов сказано «The number of entries in the array depends on the values of the biBitCount and biClrUsed members of the BITMAPINFOHEADER structure.» (перевод: «количество элементов в массиве зависит от значений полей biBitCount и biClrUsed структуры BITMAPINFOHEADER»), а в статьях структур версий 3, 4, 5 (см., например, «BITMAPV5HEADER structure от 11 октября 2013 на Wayback Machine») в описании поля BitCount везде написано «the bmiColors member of BITMAPINFO contains up to 256 entries» (аналогично про другие битности; перевод фразы: «член bmiColors BITMAPINFO содержит до 256 элементов»).
- См., например, описания к битностям 16 и 32 у поля bV5BitCount в статье «BITMAPV5HEADER structure от 11 октября 2013 на Wayback Machine» на MSDN.
- На MSDN и справке Microsoft Windows SDK в статье «BITMAPINFOHEADER structure от 9 февраля 2014 на Wayback Machine» в описании значения 16 поля biBitCount есть сбивающее с толку предложение «All the bits in the pixel do not have to be used.» (перевод: «Не задействовать все биты в пикселе»). Это опечатка (написали «have» вместо «need»), которая отсутствует в аналогичном блоке в статье про пятую версию от 11 октября 2013 на Wayback Machine (в четвёртой это предложение отсутствует).
- Данная информация есть в справке по Microsoft Windows SDK, которая идёт в комплекте вместе с крупными IDE.
- См. «Image Pixel Format Constants от 4 мая 2014 на Wayback Machine» про GDI+ в MSDN.
- См. «PixelFormat Enumeration от 23 июня 2013 на Wayback Machine» про .NET Framework 1.1 в MSDN.
- См. раздел «Remarks от 24 июня 2014 на Wayback Machine» в статье «BITMAPINFO» на MSDN.
- В документации (например, в статье «BITMAPV5HEADER structure от 11 октября 2013 на Wayback Machine» на MSDN) сказано, что нулевой размер можно указывать при значении 0 (BI_RGB) поля Compression. Очевидно, что это применимо и к значениям 3 (BI_BITFIELDS) и 6 (BI_ALPHABITFIELDS), так как они вносят различие лишь во внутреннюю структуру пикселей, а не в их размер.
- По своей сути один-в-один как в структуре RGBQUAD, которая используется в таблице цветов.
- На MSDN в статье «BITMAPV4HEADER structure от 11 октября 2013 на Wayback Machine» упоминается только одно значение поля CSType (LCS_CALIBRATED_RGB). Полный список доступных значений для версий 4 и 5 можно посмотреть в статье «Using Structures in WCS 1.0 от 3 мая 2015 на Wayback Machine».
- Здесь после «Win» идёт ещё пробел.
- Использование такого стиля значений констант только в поле CSType является скорее всего результатом влияния спецификации ICC, у которой в файлах цветовых профилей 32-битным меткам (англ. tags) значения выданы аналогично.
- См. раздел «Remarks» в статье «LOGCOLORSPACE Structure от 14 апреля 2013 на Wayback Machine» на MSDN.
- Числа взяты из стандарта «A Standard Default Color Space for the Internet — sRGB от 20 августа 2011 на Wayback Machine». Все значения округлялись вверх если был установлен самый первый отброшенный права бит.
- С обнулённым младшим байтом будет значение 00001A0016 (округлено вверх).
- Описание данного формата есть в спецификации ICC.1:2010, ссылка на которую есть в конце данной статьи.
- См. раздел «Remarks» статьи «BITMAPV5HEADER structure от 11 октября 2013 на Wayback Machine» на MSDN.
- См. статью «Using Structures in WCS 1.0 от 3 мая 2015 на Wayback Machine» на MSDN.
- См. раздел «7.2 Profile header» в спецификации ICC.1:2010.
- Определение дано в спецификации ICC.1:2010 в разделе 3.1.27 на с. 21.
- В версии 4.3 спецификации (последняя на момент написания статьи) данная тема широко освещается в разделах «0.4 Rendering intents» (во вступлении; с. 8), «6.2 Rendering intent» (в основном содержимом; с. 26) и «D.6 Discussion of colorimetric intents» (в приложениях; с. 109).
- Сопоставления констант взяты из файла Icm.h (закомментированный блок прямо над объевлениями констант «INTENT_»).
- См. раздел «7.2.15 Rendering intent field (bytes 64 to 67)» спецификации ICC.
- См. раздел «Picture Intent» в статье «Rendering Intents от 18 сентября 2012 на Wayback Machine» на MSDN.
- В спецификации внизу страницы 41.
Литература
Microsoft (MSDN и SDK)
Microsoft Windows SDK — комплект для разработчиков, который включает в себя справку и включаемые файлы на языке C++. По теме данной статьи актуальны файлы WinGDI.h и Icm.h, из которых были взяты в первую очередь значения констант. Последнюю версию данного комплекта можно бесплатно скачать с сайта Microsoft (в данной статье использовались версии 6.0 и 7.1).
У Microsoft нет отдельной специальной документации именно по формату BMP. Но его структуры и прочие элементы описаны в рамках подсистемы GDI. Это описание есть в справке, которая включается в вышеупомянутое SDK, а также на MSDN. Причём в последнем она присутствует для разных платформ и независимо в справке по Visual Studio. В большинстве случаев там представлена идентичная информация, но в некоторых местах может быть немного больше фактов (например, в справке SDK больше информации о поддержке Windows).
Основная информацию находится в справке по GDI, которая относится к платформам Windows 9x и NT. Ссылки на страницы этого раздела, которые относятся только к формату, а не к WinAPI-функциям работы с ним:
- «Bitmap Classifications» — описание аппаратно-зависимых и аппаратно-независимых битмапов.
- «Bitmap Storage» — общее описание формата файла BMP.
- «Bitmap Header Types» — обзор по версиям заголовков BMP.
- «Bitmap Compression» — описание RLE-кодирования.
- «Bitmap Structures» — раздел с описаниями структур с полями. Для удобства прямые ссылки на ключевые:
- BITMAPFILEHEADER
- BITMAPCOREHEADER
- BITMAPINFOHEADER
- BITMAPV4HEADER
- BITMAPV5HEADER
У платформ Windows Compact 2013 (CE 6.0) и Mobile 6.5 есть только описания трёх структур, но применительно к данным платформам:
- BITMAPFILEHEADER
- BITMAPCOREHEADER
- BITMAPINFOHEADER
Ссылки на другие страницы из MSDN, которые относятся к формату BMP:
- «Image Pixel Format Constants» — константы форматов пикселей GDI+.
- «PixelFormat Enumeration» — описание значений перечисляемого типа PixelFormat для .NET Framework 1.1 (самая ранняя версия).
- «Using Structures in WCS 1.0» — про используемые в управлении цветом в Windows структуры.
- «Rendering Intents» — описание предпочтений при рендеринге.
Другие
В спецификации ICC по управлению цветом можно найти информацию о цветовых профилях (в том числе о формате файлов ICC), а также о предпочтениях рендеринга. Данную спецификацию можно скачать с официального сайта концорциума color.org. В момент написания статьи последней версией была 4.3 (декабрь 2010). Прямая ссылки на PDF с сайта ICC:
- Specification ICC.1:2010 (Profile version 4.3.0.0) «Image technology colour management — Architecture, profile format, and data structure».
- Errata к спецификации (обнаруженные ошибки и опечатки; опубликованы 24 сентября 2013 года).
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер
Dlya termina Bitmap sm takzhe drugie znacheniya U etogo termina sushestvuyut i drugie znacheniya sm BMP znacheniya BMP ot angl Bitmap Picture format hraneniya rastrovyh izobrazhenij razrabotannyj kompaniej Microsoft Fajly formata BMP mogut imet rasshireniya bmp dib i rle Windows Bitmap Rasshirenie bmp dib ili rle MIME tip image bmp Razrabotchik Majkrosoft Tip formata rastrovaya grafika Mediafajly na Vikisklade S formatom BMP rabotaet ogromnoe kolichestvo programm tak kak ego podderzhka integrirovana v operacionnye sistemy Windows i OS 2 Krome togo dannye etogo formata vklyuchayutsya v dvoichnye fajly resursov RES i v PE fajly V dannom formate mozhno hranit tolko odnoslojnye rastry Na kazhdyj piksel v raznyh fajlah mozhet prihoditsya raznoe kolichestvo bit glubina cveta Microsoft predlagaet bitnosti 1 2 4 8 16 24 32 48 i 64 V bitnostyah 8 i nizhe cvet ukazyvaetsya indeksom iz tablicy cvetov palitry a pri bo lshih neposredstvennym znacheniem Cvet zhe v lyubom sluchae mozhno zadat tolko v cvetovoj modeli RGB kak pri neposredstvennom ukazanii v piksele tak i v tablice cvetov no v bitnostyah 16 i 32 mozhno poluchit Grayscale s glubinoj do 16 i 32 bit sootvetstvenno Chastichnaya prozrachnost realizovana alfa kanalom bitnostej ot 16 bit i vyshe V bolshinstve sluchaev pikseli hranyatsya v vide otnositelno prostogo dvumernogo massiva Dlya bitnostej 4 i 8 dostupno szhatie algoritmom RLE kotoroe mozhet umenshit ih razmer Format BMP takzhe podderzhivaet vstraivanie dannyh v formatah JPEG i PNG No poslednee skoree bolshe prednaznacheno ne dlya kompaktnogo hraneniya a dlya obhoda ogranichenij arhitektury GDI kotoraya ne predusmatrivaet pryamuyu rabotu s izobrazheniyami otlichnyh ot BMP formatov V poslednih versiyah formata BMP takzhe poyavilis vozmozhnosti po upravleniyu cvetom V chastnosti mozhno ukazyvat konechnye tochki proizvodit gamma korrekciyu i vstraivat cvetovye profili ICC DIB i DDBPri ispolzovanii formata DIB angl Device Independent Bitmap apparatno nezavisimyj rastr programmist mozhet poluchit dostup ko vsem elementam struktur opisyvayushih izobrazhenie pri pomoshi obychnogo ukazatelya No eti dannye ne ispolzuyutsya dlya neposredstvennogo upravleniya ekranom tak kak oni vsegda hranyatsya v sistemnoj pamyati a ne v specializirovannoj videopamyati Format pikselya v operativnoj pamyati mozhet otlichatsya ot togo formata kotoryj dolzhen zanositsya v videopamyat dlya indikacii tochki takogo zhe cveta Naprimer v DIB formate mozhet ispolzovatsya 24 bita dlya zadaniya pikselya a graficheskij adapter v etot moment mozhet rabotat v rezhime HiColor s cvetovoj glubinoj 16 bit Pri etom yarko krasnaya tochka v apparatno nezavisimom formate budet zadavatsya tremya bajtami 0000FF16 a v videopamyati slovom F80016 Pri kopirovanii kartinki na ekran sistema budet tratit dopolnitelnoe vremya na preobrazovanie kodov cveta iz 24 bitnogo formata v format Format DDB angl Device Dependent Bitmap apparatno zavisimyj rastr vsegda soderzhit cvetovye kody sovpadayushie s kodami videobufera no hranitsya on mozhet kak v sistemnoj tak i v videopamyati V oboih sluchayah on soderzhit tolko kody cveta v tom formate kotoryj obespechit peresylku izobrazheniya iz OZU v videopamyat pri pomoshi prostogo kopirovaniya Vnutrennee stroenieStruktura fajla BMP Oficialnuyu informaciyu po formatu BMP mozhno najti v MSDN ili spravke Microsoft Windows SDK mozhet idti v komplekte s nekotorymi IDE V fajle WinGDI h ot kompanii Microsoft est vse obyavleniya na yazyke C kotorye kasayutsya dannogo formata V dannuyu statyu zhe ne byli vklyucheny obyavleniya tipov tak kak ot etogo ona mozhet byt slishkom gromozdkoj K tomu zhe oficialnye obyavleniya nekotorye razrabotchiki mogut poschitat neudobnymi i poetomu ih vostrebovannost somnitelna Esli vam potrebuyutsya originalnye imena konstant struktur tipov i ih polej to oni vse est v tekste dannoj stati Maksimalnyj razmer nedelimyh yacheek isklyuchaya polya bitovyh struktur 32 bita i poetomu format mozhno klassificirovat kak 32 bitnyj Isklyucheniem mogut byt 64 bitnye pikseli no znacheniya ih kanalov mozhno obrabatyvat i 16 bitnymi slovami Poryadok bajt v 16 bitnyh i 32 bitnyh yachejkah povsyudu ot mladshego k starshemu little endian Celye chisla zapisyvayutsya v pryamom kode so znakom v dopolnitelnom Esli sravnivat s apparatnymi arhitekturami to poryadok bajt i format chisel sootvetstvuet x86 V dannoj state dlya ukazaniya tipov ispolzuyutsya imena tipov WinAPI kak v dokumentacii Microsoft Krome specificheskih opisany otdelno v tekste stati mozhno vstretit chetyre chislovyh tipa BYTE 8 bitnoe bezznakovoe celoe WORD 16 bitnoe bezznakovoe celoe DWORD 32 bitnoe bezznakovoe celoe LONG 32 bitnoe celoe so znakom V formate Windows Bitmap pod strukturami ponimaetsya blok s idushimi podryad yachejkami razlichnogo fiksirovannogo razmera u kotoryh est uslovnye imena est vo mnogih yazykah programmirovaniya a ne chto to slozhnee naprimer potok komand proizvolnogo razmera U nekotoryh elementov formata ukazana versiya Windows nachinaya s kotoroj on podderzhivaetsya Rech idyot v pervuyu ochered ob osnovnyh bibliotekah WinAPI takih kak gdi32 dll shell32 dll user32 dll i kernel32 dll Drugie komponenty operacionnoj sistemy naprimer GDI NET DirectX mogut imet drugie bolee shirokie vozmozhnosti Obshaya struktura Dannye v formate BMP sostoyat iz tryoh osnovnyh blokov razlichnogo razmera Zagolovok iz struktury BITMAPFILEHEADER i bloka BITMAPINFO Poslednij soderzhit Informacionnye polya Bitovye maski dlya izvlecheniya znachenij cvetovyh kanalov opcionalnye Tablica cvetov opcionalnaya Cvetovoj profil opcionalnyj Pikselnye dannye Pri hranenii v fajle vse zagolovki idut s samogo pervogo bajta Pikselnye dannye mogut nahoditsya na proizvolnoj pozicii v fajle ona ukazyvaetsya v pole OffBits struktury BITMAPFILEHEADER v tom chisle i v udalenii ot zagolovkov Opcionalnyj cvetovoj profil poyavilsya v versii 5 i on takzhe mozhet svobodno raspolagatsya no ego poziciya ukazyvaetsya ot nachala BITMAPINFO v pole ProfileData V operativnoj pamyati naprimer pri vzaimodejstvii s WinAPI funkciyami GDI iz zagolovkov isklyuchaetsya struktura BITMAPFILEHEADER Pri etom Microsoft rekomenduet raspolagat cvetovoj profil srazu za zagolovkami v edinom bloke Pikselnye dannye mogut imet proizvolnoe raspolozhenie v pamyati i ih adres ukazyvaetsya v parametrah procedur V lyubom sluchae rekomenduetsya v pamyati vse bloki soderzhat po adresam kratnym chetyryom v zagolovkah prisutstvuyut 32 bitnye yachejki a k pikselnym dannym takoe trebovanie ukazano v dokumentacii Eto trebovanie spravedlivo tolko dlya operativnoj pamyati pri hranenii v fajle ego priderzhivatsya ne obyazatelno BITMAPFILEHEADER BITMAPFILEHEADER 14 bajtnaya struktura kotoraya raspolagaetsya v samom nachale fajla Obratite vnimanie na to chto s samogo nachala struktury sbivaetsya vyravnivanie yacheek Esli dlya vas ono vazhno to v operativnoj pamyati dannyj zagolovok raspolagajte po chyotnym adresam kotorye ne kratny chetyryom togda 32 bitnye yachejki popadut na vyravnennye pozicii Poz hex Razmer bajty Imya Tip WinAPI Opisanie 00 2 bfType WORD Otmetka dlya otlichiya formata ot drugih signatura formata Mozhet soderzhat edinstvennoe znachenie 4D4216 424D16 little endian big endian 02 4 bfSize DWORD Razmer fajla v bajtah 06 2 bfReserved1 WORD Zarezervirovany i dolzhny soderzhat nol 08 2 bfReserved2 WORD 0A 4 bfOffBits DWORD Polozhenie pikselnyh dannyh otnositelno nachala dannoj struktury v bajtah Signatura formata pri prosmotre soderzhimogo fajla tekstom v dvoichnom rezhime vyglyadit kak para ASCII simvolov BM BITMAPINFO BITMAPINFO v fajle idyot srazu za BITMAPFILEHEADER Adres etogo bloka v pamyati napryamuyu takzhe peredayotsya nekotorym funkciyam WinAPI naprimer SetDIBitsToDevice ili CreateDIBitmap Krome etogo etot zhe blok ispolzuetsya v formatah znachkov i kursorov Windows no v dannoj state etot moment ne rassmatrivaetsya sm otdelnye opisaniya etih formatov Dannaya struktura yavlyaetsya osnovnoj i opisatelnoj v formate BMP i poetomu kogda prosto upomyanuto imya polya to rech idyot o pole v dannoj strukture Blok BITMAPINFO sostoit iz tryoh chastej Struktura s informacionnymi polyami Bitovye maski dlya izvlecheniya znachenij cvetovyh kanalov prisutstvuyut ne vsegda Tablica cvetov prisutstvuet ne vsegda Pro bitovye maski i tablicu cvetov smotrite nizhe v otdelnyh razdelah Zdes dalee pojdyot opisanie struktury s informacionnymi polyami V moment napisaniya dannoj stati struktura s informacionnymi polyami imela chetyre versii CORE 3 4 i 5 oboznacheniya versij privedeny uslovnye v ramkah dannoj stati dlya kratkosti Dlya kazhdoj versii Microsoft obyavila chetyre otdelnye struktury s raznymi imenami polej V dannoj state pri upominanii polya kotoroe prisutstvuet v neskolkih strukturah beryotsya obshaya dlya vseh struktur chast v konce imeni naprimer BitCount vmesto bcBitCount biBitCount bV4BitCount ili bV5BitCount Versiyu struktury mozhno opredelit po pervoj 32 bitnoj yachejke WinAPI tip DWORD kotoraya soderzhit eyo razmer v bajtah bezznakovym celym Versiya CORE otlichaetsya ot vseh svoej kompaktnostyu i ispolzovaniem isklyuchitelno 16 bitnyh bezznakovyh polej Ostalnye tri soderzhat identichnye yachejki k kotorym v kazhdoj novoj versii dobavlyalis novye Nizhe predstavlena obzornaya tablica po informacionnym strukturam Versiya Razmer bajty Imya struktury Versiya Windows 9x NT Versiya Windows CE Mobile Primechaniya CORE 12 BITMAPCOREHEADER 95 NT 3 1 i starshe CE 2 0 Mobile 5 0 i starshe Soderzhit tolko shirinu vysotu i bitnost rastra 3 40 BITMAPINFOHEADER 95 NT 3 1 i starshe CE 1 0 Mobile 5 0 i starshe Soderzhit shirinu vysotu i bitnost rastra a takzhe format pikselej informaciyu o cvetovoj tablice i razreshenii 4 108 BITMAPV4HEADER 95 NT 4 0 i starshe ne podderzhivaetsya Otdelno vydeleny maski kanalov dobavlena informaciya o cvetovom prostranstve i gamme 5 124 BITMAPV5HEADER 98 2000 i starshe ne podderzhivaetsya Dobavleno ukazanie predpochtitelnoj strategii otobrazheniya i podderzhka profilej ICC Iz za identichnosti polej v versiyah 3 4 i 5 mozhet pokazatsya chto polem Size mozhno regulirovat kolichestvo polej ubiraya neispolzuemye V dejstvitelnosti eto ne korrektno tak kak zdes razmer igraet rol versii v versii CORE hot i tozhe identichnye polya no drugogo razmera i tipa Nikto ne garantiruet chto vam ne mogut popastsya zagolovki menshih ili bolshih razmerov s drugim naborom polej Tem ne menee Adobe Photoshop mozhet pri sohranenii fajlov BMP zapisyvat struktury informacionnyh polej s razmerami 52 i 56 bajt Po suti eto urezannaya 4 ya versiya kotoraya soderzhat tolko bitovye maski kanalov 56 bajt versiya s alfa kanalom 16 bitnye informacionnye polya versiya CORE Obratite vnimanie na to chto zdes polya shiriny i vysoty soderzhat bezznakovye celye v to vremya kak 32 bitnye struktury hranyat znacheniya so znakom Poziciya v fajle hex Poziciya v strukture hex Razmer bajty Imya Tip WinAPI Opisanie 0E 00 4 bcSize DWORD Razmer dannoj struktury v bajtah ukazyvayushij takzhe na versiyu struktury zdes dolzhno byt znachenie 12 12 04 2 bcWidth WORD Shirina bcWidth i vysota bcHeight rastra v pikselyah Ukazyvayutsya celym chislom bez znaka Znachenie 0 ne dokumentirovano 14 06 2 bcHeight WORD 16 08 2 bcPlanes WORD V BMP dopustimo tolko znachenie 1 Eto pole ispolzuetsya v znachkah i kursorah Windows 18 0A 2 bcBitCount WORD Kolichestvo bit na piksel spisok podderzhivaemyh smotrite v otdelnom razdele nizhe 32 bitnye informacionnye polya versii 3 4 i 5 V tablice nizhe polya predstavleny obzorno Podrobnuyu informaciyu vy mozhete najti v razdelah dalee Poziciya v fajle hex Poziciya v strukture hex Razmer bajty Imya versii 3 4 5 Tip WinAPI Opisanie 0E 00 4 biSize bV4Size bV5Size DWORD Razmer dannoj struktury v bajtah ukazyvayushij takzhe na versiyu struktury sm tablicu versij vyshe 12 04 4 biWidth bV4Width bV5Width LONG Shirina rastra v pikselyah Ukazyvaetsya celym chislom so znakom Nol i otricatelnye ne dokumentirovany 16 08 4 biHeight bV4Height bV5Height LONG Celoe chislo so znakom soderzhashee dva parametra vysota rastra v pikselyah absolyutnoe znachenie chisla i poryadok sledovaniya strok v dvumernyh massivah znak chisla Nulevoe znachenie ne dokumentirovano 1A 0C 2 biPlanes bV4Planes bV5Planes WORD V BMP dopustimo tolko znachenie 1 Eto pole ispolzuetsya v znachkah i kursorah Windows 1C 0E 2 biBitCount bV4BitCount bV5BitCount WORD Kolichestvo bit na piksel spisok podderzhivaemyh smotrite v otdelnom razdele nizhe 1E 10 4 biCompression bV4V4Compression bV5Compression DWORD Ukazyvaet na sposob hraneniya pikselej sm v razdele nizhe 22 14 4 biSizeImage bV4SizeImage bV5SizeImage DWORD Razmer pikselnyh dannyh v bajtah Mozhet byt obnuleno esli hranenie osushestvlyaetsya dvumernym massivom 26 18 4 biXPelsPerMeter bV4XPelsPerMeter bV5XPelsPerMeter LONG Kolichestvo pikselej na metr po gorizontali i vertikali sm razdel Razreshenie izobrazheniya dannoj stati 2A 1C 4 biYPelsPerMeter bV4YPelsPerMeter bV5YPelsPerMeter LONG 2E 20 4 biClrUsed bV4ClrUsed bV5ClrUsed DWORD Razmer tablicy cvetov v yachejkah 32 24 4 biClrImportant bV4ClrImportant bV5ClrImportant DWORD Kolichestvo yacheek ot nachala tablicy cvetov do poslednej ispolzuemoj vklyuchaya eyo samu Dobavleny v versii 4 Poziciya v fajle hex Poziciya v strukture hex Razmer bajty Imya versii 4 5 Tip WinAPI Opisanie 36 28 4 bV4RedMask bV5RedMask DWORD Bitovye maski dlya izvlecheniya znachenij kanalov intensivnost krasnogo zelyonogo sinego i znachenie alfa kanala 3A 2C 4 bV4GreenMask bV5GreenMask DWORD 3E 30 4 bV4BlueMask bV5BlueMask DWORD 42 34 4 bV4AlphaMask bV5AlphaMask DWORD 46 38 4 bV4CSType bV5CSType DWORD Vid cvetovogo prostranstva 4A 3C 36 bV4Endpoints bV5Endpoints CIEXYZTRIPLE Znachenie etih chetyryoh polej beryotsya vo vnimanie tolko esli pole CSType soderzhit 0 LCS CALIBRATED RGB Togda konechnye tochki i znacheniya gammy dlya tryoh cvetovyh komponent ukazyvayutsya v etih polyah 6E 60 4 bV4GammaRed bV5GammaRed DWORD 72 64 4 bV4GammaGreen bV5GammaGreen DWORD 76 68 4 bV4GammaBlue bV5GammaBlue DWORD Dobavleny v versii 5 Poziciya v fajle hex Poziciya v strukture hex Razmer bajty Imya Tip WinAPI Opisanie 7A 6C 4 bV5Intent DWORD Predpochteniya pri renderinge rastra 7E 70 4 bV5ProfileData DWORD Smeshenie v bajtah cvetovogo profilya ot nachala BITMAPINFO sm takzhe razdel Cvetovoj profil nizhe v etoj state 82 74 4 bV5ProfileSize DWORD Esli v BMP neposredstvenno vklyuchaetsya cvetovoj profil to zdes ukazyvaetsya ego razmer v bajtah 86 78 4 bV5Reserved DWORD Zarezervirovano i dolzhno byt obnuleno Bitnost izobrazheniya pole BitCount Pole BitCount soderzhit kolichestvo bit kotoroe prihoditsya na kazhdyj piksel Esli tam ukazano otlichnoe ot nulya znachenie to eto i est realnaya bitnost Nulevoe zhe soderzhimoe polya BitCount ukazyvaetsya esli pikseli hranyatsya v formate JPEG ili PNG Togda dejstvitelnaya bitnost budet opredelyatsya uzhe etimi formatami Bitnosti chisto BMP formata predstavleny v tablice nizhe Bit Bajt BITMAPINFO RLE Maski kanalov Podderzhka programmnym obespecheniem CORE 3 4 5 Windows 9x i NT Windows CE i Mobile GDI i NET 1 Da Da Net Net Da Da Da 2 Da Da Net Net Net Da Net 4 Da Da Da Net Da Da Da 8 1 Da Da Da Net Da Da Da 16 2 Net Da Net Da Da Da Da 24 3 Da Da Net Net Da Da Da 32 4 Net Da Net Da Da Da Da 48 6 Net Da Net Net Net Net Da 64 8 Net Da Net Net Net Net Da Primechaniya k tablice 1 V kolonke BITMAPINFO ukazana podderzhka bitnostej tolko so storony Microsoft 2 Windows CE 1 0 i 1 01 podderzhivaet tolko bitnosti 1 i 2 3 GDI versii 1 0 16 bitnye cvetovye kanaly umeet tolko schityvat srazu perevodya ih v 8 bitnye V bitnostyah 8 i nizhe cvet pikselya ukazyvaetsya indeksom v tablice cvetov v vysshih neposredstvennym znacheniem v cvetovoj modeli RGB Alfa kanal opcionalno mozhet byt dobavlen v bitnostyah 16 i 32 V bitnosti 64 on prisutstvuet permanentno V tablice predstavleny tolko bitnosti kotorye dokumentirovala korporaciya Microsoft Sam format ne soderzhit nikakih principialnyh ogranichenij na ispolzovanie kakih libo ne upomyanutyh zdes bitnostej 1 bitnye BMP fajly s chisto chyornym sbroshennyj bit i belym ustanovlennyj bit cvetami nazyvayut monohromnymi Takie fajly obychno ispolzuyutsya v kachestve masok dlya drugih rastrov Vozmozhno vam postoyanno popadalis na glaza imenno takie 1 bitnye rastry V dejstvitelnosti format Windows Bitmap ne nakladyvaet nikakih ogranichenij na to kakie cveta budut ispolzovatsya dlya kazhdogo iz znachenij bit Vy mozhete takzhe vstretit sleduyushie nazvaniya bitnostej CGA dlya dvuh bit EGA dlya chetyryoh HiColor HighColor dlya 16 bit TrueColor dlya 24 i 32 bit s poluprozrachnostyu DeepColor dlya bolshih bitnostej i vozmozhno drugie Eti nazvaniya poyavilis v period razvitiya cvetnyh rastrovyh displeev i otnosyatsya bolshe k ih glubine cveta K momentu napisaniya dannoj stati 2014 god takie nazvaniya uzhe davno ne ispolzuyutsya iz za silnogo rasprostraneniya 24 bitnyh ustrojstv vmesto etogo prosto ukazyvaetsya glubina cveta v bitah ili ih kolichestvo A BMP fajly v menshej bitnosti sohranyayutsya v bolshej stepeni ne dlya otobrazheniya na CGA ili EGA ustrojstvah a dlya kompaktnosti po sravneniyu s 24 bitnymi i 32 bitnymi formatami esli ispolzuetsya maloe kolichestvo cvetov Pole Compression Dlya kazhdoj gruppy bitnostej ispolzuyutsya otdelnye ogranichennye znacheniya Compression no v sovokupnosti ih znacheniya unikalny Microsoft dokumentirovala sleduyushie znacheniya v tablice ukazany imena konstant ot etoj korporacii Znachenie Imya konstanty Primenimo k BitCount Hranenie pikselej Znak Height Versiya Windows 9x NT CE 0 BI RGB lyubym krome nulya dvumernyj massiv 95 NT 3 1 CE 1 0 1 BI RLE8 8 RLE kodirovanie 95 NT 3 1 ne podd 2 BI RLE4 4 RLE kodirovanie 95 NT 3 1 ne podd 3 BI BITFIELDS 16 i 32 dvumernyj massiv s maskami cvetovyh kanalov 95 NT 3 1 CE 2 0 4 BI JPEG 0 vo vstroennom JPEG fajle 98 2000 ne podd 5 BI PNG 0 vo vstroennom PNG fajle 98 2000 ne podd 6 BI ALPHABITFIELDS 16 i 32 dvumernyj massiv s maskami cvetovyh i alfa kanala ne podd NET 4 0 Tablica cvetov Tablica cvetov yavlyaetsya chastyu bloka BITMAPINFO i mozhet ispolzovatsya v dvuh sluchayah Ona obyazatelno prisutstvuet pri bitnostyah 8 i nizhe v kotoryh cvet pikselej zadayotsya indeksom yachejki iz neyo Pri bitnostyah 8 i vyshe v kotoryh cvet ukazyvaetsya neposredstvennym znacheniem tablica prisutstvuet esli ispolzuetsya zagolovok ne CORE versii u kotorogo pole ClrUsed soderzhit nenulevoe znachenie Zdes ona zadejstvuetsya uzhe dlya optimizacii cvetov pri rabote s ispolzuyushimi palitry ustrojstvami kak imenno proizvoditsya optimizaciya v dokumentacii ne skazano Poziciya tablicy cvetov ukazyvaetsya ot ego nachala bloka BITMAPINFO Po umolchaniyu ona idyot srazu za informacionnoj strukturoj eyo bezznakovyj razmer v bajtah mozhno prochitat iz pervogo 32 bitnogo polya No mezhdu strukturoj s polyami i cvetovoj tablicej mogut idti chetyryohbajtnye bitovye maski dlya izvlecheniya cvetovyh kanalov kasaetsya tolko bitnostej 16 i 32 Oni tam nahodyatsya tolko esli ispolzuetsya informacionnaya struktura 3 j versii Size 40 i pole Compression soderzhit 3 BI BITFIELDS ili 6 BI ALPHABITFIELDS Togda k razmeru informacionnyh polej nuzhno pribavit 12 pri znachenii BI BITFIELDS ili 16 bajt esli ukazano BI ALPHABITFIELDS Poluchaetsya 6 variantov raspolozheniya tablicy Versiya zagolovka Poziciya hex Primechaniya V fajle V BITMAPINFO CORE 1A 0C maski kanalov ne podderzhivayutsya 3 36 28 Compression ne soderzhit 3 ili 6 42 34 Compression 3 BI BITFIELDS 46 38 Compression 6 BI ALPHABITFIELDS 4 7A 6C maski kanalov vstroeny v informacionnye polya 5 8A 7B Kolichestvo yacheek v tablice opredelyaetsya po polyam BitCount i ClrUsed Pri bitnostyah 8 i nizhe maksimalnoe kolichestvo yacheek v tablice prinimaetsya za 2bitnost 2 v odnobitnom rastre 4 v dvuhbitnom 16 v 4 bitnom i 256 v 8 bitnom V dannyh bitnostyah tablica vsegda soderzhit eto maksimalnoe kolichestvo yacheek esli ispolzuetsya zagolovok versii CORE Size 12 ili esli v drugih versiyah pole ClrUsed soderzhit 0 Vo vseh ostalnyh sluchayah nezavisimo ot bitnosti v tablice nahoditsya stolko zhe yacheek skolko ukazano v pole ClrUsed Sama zhe tablica predstavlyaet soboj odnomernyj massiv kotoryj mozhet soderzhat yachejki tryoh tipov 32 bitnaya struktura RGBQUAD Primenyaetsya esli v BITMAPINFO ispolzovana informacionnaya struktura versii 3 4 ili 5 V samoj zhe strukture RGBQUAD ukazyvaetsya cvet v modeli RGB v chetyryoh bajtovyh yachejkah vse imeyut WinAPI tip BYTE rgbBlue sinij rgbGreen zelyonyj rgbRed krasnyj i rgbReserved zarezervirovana i dolzhna byt obnulena 24 bitnaya struktura RGBTRIPLE Primenyaetsya esli BITMAPINFO nachinaetsya so struktury BITMAPCOREHEADER RGBTRIPLE sostoit iz tryoh bajtovyh yacheek WinAPI tip BYTE v kotoryh ukazyvaetsya cvet v modeli RGB rgbtBlue sinij rgbtGreen zelyonyj i rgbtRed krasnyj 16 bitnye indeksy cvetov bezznakovye celye chisla v tekushej logicheskoj palitre konteksta ustrojstva sistemnye obekty Windows GDI Etot vid dostupen tolko vo vremya vypolneniya prilozheniya Format BMP ne podderzhivaet yavnoe ukazanie chto ispolzuetsya takaya tablica i poetomu prilozhenie samo izveshaet WinAPI funkcii ob etom v specialnyh parametrah kak pravilo konstantoj DIB PAL COLORS Vo vsej tablice mogut byt zadejstvovany ne vse yachejki i v pole ClrImportant pomeshaetsya kolichestvo yacheek ot nachala tablicy do poslednej ispolzuemoj vklyuchaya eyo samu Soderzhimoe 0 polya ClrImportant ukazyvaet na to chto ispolzuetsya vsya tablica Zadejstvovannye yachejki luchshe razmeshat v samom nachale tablicy i rekomenduetsya pri etom otsortirovat ih po ubyvaniyu stepeni vazhnosti na sluchaj esli pridyotsya umenshit ih kolichestvo Maski dlya izvlecheniya znachenij cvetovyh kanalov Esli bitnost izobrazheniya 16 ili 32 to mogut byt ukazany 32 bitnye maski dlya izvlecheniya cvetovyh kanalov Eto svyazano s tem chto 16 ne kratno tryom i poetomu bity mogut byt raspredeleny raznymi sposobami V 32 bitnyh izobrazheniyah iz za udobstva ispolzuyut 8 bitnye kanaly i poetomu podderzhka dlya nih mozhet pokazatsya izbytochnoj V dejstvitelnosti zdes maska dayot vozmozhnost vklyuchit otklyuchit alfa kanal ili ustanovit udobnyj vam poryadok sledovaniya komponent a ne tolko regulirovat ih razreshenie Pri primenenii masok yachejka pikselya schityvaetsya celikom kak sootvetstvuyushee mashinnoe slovo v little endian Nalichie bitovyh masok zavisit ot versii informacionnyh polej struktury BITMAPINFO i polya Compression v nej Dlya versii CORE proizvolnye maski ukazat nelzya tak kak tam otsutstvuet pole Compression i otdelnye polya masok V ostalnyh versiyah cvetovye maski zadejstvuyutsya esli Compression soderzhit 3 BI BITFIELDS Maska alfa kanala ispolzuetsya vsegda v versiyah 4 i 5 Tak kak Windows CE ne podderzhivaet eti dve versii v kotoryh dlya neyo est specialnoe pole dlya tretej versii bylo vvedeno znachenie 6 BI ALPHABITFIELDS polya Compression kotoroe dobavlyaet srazu cvetovye maski i masku alfa kanala podderzhivaetsya nachinaya s Windows CE NET 4 0 Polozhenie bitovyh masok fiksirovano nezavisimo ot versii zagolovka 36h vo vsyom fajle ili 28h ot nachala bloka BITMAPINFO V versiyah 4 i 5 na etom meste raspolagayutsya prednaznachennye specialno dlya nih polya V versii zhe 3 bitovye maski dolzhny raspolagatsya srazu za informacionnymi polyami i takim obrazom oni tochno popadayut na pozicii sootvetstvuyushih polej v starshih versiyah Obratite vnimanie na to chto v tretej versii pri nalichii masok sdvigaetsya tablica cvetov na 12 ili 16 bajt vperyod raspolagayas srazu za nimi 4 bajtnye maski cvetov sleduyut v poryadke krasnaya zelyonaya sinyaya Maska alfa kanala raspolagaetsya uzhe za nimi V dokumentacii Microsoft k bitovym maskam primenyaetsya tolko odno obyazatelnoe trebovanie kazhdaya maska dolzhna byt nepreryvnoj Pro sluchaj peresecheniya masok tam skazano chto zhelatelno etogo ne delat Microsoft takzhe govorit o tom chto ne obyazatelno zadejstvovat vse bity pikselya Kakie libo trebovaniya k soderzhimomu neispolzuemyh bit otsutstvuyut Obratite vnimanie na to chto nikto ne garantiruet chto mogut byt ispolzovany maski shire 8 bit I nichego ne skazano pro sluchaj kogda u kakogo libo kanala budet nulevaya maska naprimer kogda on dejstvitelno ne ispolzuetsya Zdes vozmozhna situaciya kogda nulevye maski budut u vseh komponentov i ostanetsya odin alfa kanal kotoryj pri etom mozhet zanyat vse bity Nulevuyu masku cvetovogo kanala mozhno traktovat dvumya sposobami ego znachenie prinimaetsya za nol ili zhe pri prorisovke pikseli etogo kanala ne zatragivayutsya Esli vzyat pervyj variant interpretacii s edinstvennym alfa kanalom to alfa kanal po suti budet zadavat stepen zacherneniya pikselya Krome neopredelyonnyh variantov est takzhe i interesnyj Tak kak peresecheniya ne zapresheny to mozhno vse kanaly vystavit na odnu poziciyu i tem samym poluchit Grayscale Nekotoroe PO imeet ogranichennyj nabor podderzhivaemyh bitovyh masok V tablice nizhe privedeny dostupnye varianty v takih ogranichennyh sredah Bitnost Znacheniya masok hex Podderzhka v PO Krasnyj Zelyonyj Sinij Alfa Neispolzuemye Windows 9x GDI i NET 16 a 7C00 03E0 001F 0000 8000 Da Da 7C00 03E0 001F 8000 0000 Net Da F800 07E0 001F 0000 0000 Da Da b FFFF FFFF FFFF 0000 0000 Net Da 32 a 00FF 0000 0000 FF00 0000 00FF 0000 0000 FF00 0000 Da Da 00FF 0000 0000 FF00 0000 00FF FF00 0000 0000 0000 Net Da Primechaniya k tablice a Eti nabory ispolzuyutsya po umolchaniyu v bitnostyah 16 i 32 esli maski dlya izvlecheniya cvetov ne zadany b Dannyj nabor masok po svoej suti realizuet 16 bitnyj Grayscale Pikselnye dannye V fajle polozhenie pikselnyh dannyh mozhno uznat iz polya OffBits struktury BITMAPFILEHEADER Vo vremya vypolneniya prilozhenie hranit adres pikselnyh dannyh tam gde udobnej V dokumentacii Microsoft takzhe upominayutsya tak nazyvaemye upakovannye angl packed bitmapy kotorye ukazyvayutsya odnim adresom bloka BITMAPINFO U takih bitmapov pikselnye dannye sleduyut srazu za zagolovkom vklyuchaya pomimo informacionnyh polej bitovye maski i tablicu cvetov Razmer pikselnyh dannyh v bajtah zapisyvaetsya v pole SizeImage struktury BITMAPINFO Tuda zapisyvayutsya imenno syroj razmer togo nepreryvnogo bloka kotoryj soderzhit dannye dlya formirovaniya pikselej nezavisimo ot formata a ne kakoj nibud raspakovannyj Po umolchaniyu eto pole obyazatelno dolzhno soderzhat aktualnoe znachenie tak kak po nemu mozhno tochno uznat skolko imenno bajt nuzhno schitat iz fajla dlya polucheniya pikselej Tem ne menee dopustimo soderzhat v etom pole nol pri hranenii pikselej dvumernymi massivami kogda pole Compression soderzhit znachenie 0 BI RGB 3 BI BITFIELDS ili 6 BI ALPHABITFIELDS Togda razmer pikselej pri neobhodimosti mozhno otnositelno bystro rasschitat ishodya iz bitnosti shiriny i vysoty rastra V formate Windows Bitmap dostupno tri sposoba hraneniya pikselej sm takzhe razdel Pole Compression dannoj stati Dvumernyj massiv RLE tolko dlya bitnostej 4 i 8 V formatah JPEG ili PNG V podrazdelah dalee otdelno opisan kazhdyj iz nih Ukazanie cveta i znacheniya alfa kanala Dlya ukazaniya cveta pri hranenii v formate BMP nezavisimo ot sposoba zadaniya ispolzuyutsya tolko bezznakovye celye chisla Sam zhe cvet pikselya mozhet zadavatsya dvumya sposobami Indeksom v tablice cvetov pri bitnostyah 8 i nizhe Neposredstvennym znacheniem v cvetovoj modeli RGB pri bitnostyah vyshe 8 Vtoroj celesoobrazno ispolzovat kogda nabor cvetov dovolno bolshoj ili nepredskazuem naprimer vo vremya obrabotki izobrazheniya Pervyj zhe sposob obespechivaet kak kompaktnuyu komponovku pri malom nabore cvetov tak i nekotoroe udobstvo v upravlenii ispolzuemymi cvetami dostatochno izmenit znachenie cveta v palitre V samoj tablice cvetov ukazyvayutsya ili 16 bitnye bezznakovye indeksy v sistemnoj palitre sm razdel Tablica cvetov v dannoj state ili zhe v RGB kak v piksele no isklyuchitelno 8 bitnymi znacheniyami kanalov Indeks v tablice cvetov eto nomer yachejki v nej ot nachala tablicy ispolzuetsya nepreryvnaya numeraciya nachinaya s nulya Dlya kazhdoj bitnosti maksimalnyj indeks principialno ogranichen znacheniem 2bitnost 1 V dejstvitelnosti zhe on ogranichen eshyo i kolichestvom elementov v tablice podrobnosti v razdele Tablica cvetov dannoj stati Microsoft ne dokumentirovala povedenie v sluchae kogda ukazyvaetsya indeks za predelami tablicy no GDI v etom sluchae beryot chyornyj cvet V bitnostyah vyshe 8 cvet pikselya ukazyvaetsya neposredstvenno v cvetovoj modeli RGB otdelno ukazyvaetsya uroven krasnogo cveta zelyonogo i sinego Nulevoe znachenie lyubogo iz kanalov oznachaet polnoe otsutstvie sootvetstvuyushego ottenka a maksimalnoe polnoe ego prisutstvie Razreshenie zhe znachenij kanalov peremennoe i v kazhdoj bitnosti ono svoyo konkretnye znacheniya smotrite v razdele pro hranenie pikselej v dvumernom massive etoj stati Pri etom v bitnostyah 16 i 32 mozhet byt zadano ne tolko proizvolnoe razreshenie no i individualnoe dlya kazhdogo kanala naprimer 5 bit dlya krasnoj i sinej no 6 bit dlya zelyonoj Nesmotrya na bolshoe kolichestvo variantov zadaniya razresheniya znachenij v dokumentacii Microsoft ne skazano kak proizvodit izmenenie razresheniya znacheniya Iz za etogo u raznyh proizvoditelej programmnogo obespecheniya mogut poluchatsya razlichnye rezultaty pri smene bitnosti Pri neposredstvennom zadanii cveta pikselya krome znachenij RGB format Windows Bitmap opcionalno pozvolyaet eshyo zadat znacheniya alfa kanala V plane bitnosti i kodirovanii znachenij on identichen cvetovym kanalam u nego proizvolnaya bitnost i ispolzuyutsya bezznakovye celye Chto zhe kasaetsya sopostavleniya znachenij to nol sootvetstvuet polnoj prozrachnosti a maksimalnoe dostupnoe chislo polnoj zapolnennosti Dvumernyj massiv V dvumernom massive mozhno hranit pikseli lyuboj bitnosti Pri takom sposobe hraneniya pole Compression soderzhit znachenie 0 BI RGB 3 BI BITFIELDS ili 6 BI ALPHABITFIELDS Esli ispolzuetsya zagolovok versii CORE to pikseli v lyubom sluchae hranyatsya tolko dvumernym massivom V dannoj komponovke pikseli rastra zapisyvayutsya odnopikselnymi gorizontalnymi poloskami kotorye Microsoft v svoej dokumentacii chasto nazyvaet scans v russkom yazyke naibolee blizkoe slovo stroki V pamyati eti ryady zapisyvayutsya po poryadku no pri polozhitelnom Height nachinaya s samogo nizhnego angl bottom up bitmap a pri otricatelnom s samogo verhnego angl top down bitmap Vnutri kazhdogo gorizontalnogo ryada pikseli zapisyvayutsya strogo tolko ot levogo k pravomu Pikseli menshe 8 bit razmeshayutsya v bajtah zapolnyaya bity ot starshih k mladshim v rezultate chego shestnadcatirichnye dvoichnye chislovye znacheniya pikselej bolee pohozhi na vyvodimoe izobrazhenie Esli bitnost 16 ili 32 to obrabotka osushestvlyaetsya celnymi mashinnymi slovami analogichnogo razmera s poryadkom bit ot mladshego k starshemu little endian Ryady nezavisimo ot razmera yacheek obyazatelno dolzhny dopolnyatsya nulyami do kratnogo chetyryom bajtam razmera Iz za etogo pri nekratnoj shirine izobrazheniya v konce ryadov mogut okazyvatsya neispolzuemye bity ili celye bajty No blagodarya garantirovannoj kratnosti razmera ryada obrabotku mozhno proizvodit 8 16 ili 32 bitnymi mashinnymi slovami po vyboru I u Microsoft eshyo proslezhivaetsya sleduyushaya tendenciya v bitnostyah bolshe 8 komponent Blue sinij cvet razmeshaetsya v mladshih bitah pervyh bajtah Green zelyonyj v posleduyushih a Red krasnyj starshe dalshe vseh i esli est alfa kanal to on nahoditsya v samyh starshih bitah poslednih bajtah Diagramma nizhe otobrazhaet raspolozhenie pikselej v bitnostyah menshe 8 Bity 7 6 5 4 3 2 1 0 1 bit 0 1 2 3 4 5 6 7 2 bita 0 1 2 3 4 bita 0 1 V bitnostyah 16 i 32 pikseli obrabatyvayutsya mashinnymi slovami analogichnogo razmera predpolagaetsya poryadok bajt little endian kotorym primenyayutsya bitovye maski kanalov Esli individualnye bitovye maski ne zadany to struktura budet sleduyushaya Pri 16 bit na kazhdyj kanal otvoditsya po 5 bit Sinij raspolagaetsya v mladshih bitah maska 001F16 zelyonyj na pozicii 5 maska 03E016 krasnyj nachinaya s 10 go bita maska 7C0016 a starshij ostavshijsya bit 15 ne ispolzuetsya Esli ispolzuetsya bitnost 32 to po umolchaniyu na kazhdyj kanal otvoditsya uzhe po bajtu 8 bit Komponenty raspolagayutsya analogichno sinij v mladshih bitah maska 0000 00FF16 zelyonyj nachinaya s bita 8 maska 0000 FF0016 krasnyj nachinaetsya s bita 16 maska 00FF 000016 a starshij bajt ne ispolzuetsya on ispolzuetsya v kachestve alfa kanala tolko esli pryamo eto pokazat Tak kak predpolagaetsya chtenie v poryadke bajta little endian to esli chitat znacheniya iz pamyati po bajtovo oni budut raspolagat v takom zhe poryadke sinij budet idti pervym Pri bitnosti 24 na kazhdyj kanal prihoditsya po bajtu a v bitnostyah 48 i 64 po 16 bitnomu mashinnomu slovu Vo vseh tryoh sluchayah v pamyati cvetovye komponenty idut v poryadke sinij zelyonyj krasnyj V 64 bitnyh BMP za cvetami dopolnitelno sleduet 16 bitnyj alfa kanal Esli zahotite 64 bitnyj piksel obrabotat celnym mashinnym slovom to v little endian sinij okazhetsya v mladshih 16 bitah a alfa kanal v starshih Zelyonyj sootvetstvenno budet ryadom k krasnym a sinij ryadom s alfa I mozhno zametit chto v 24 bitah format pikselya sootvetstvuet strukture RGBTRIPLE iz tablicy cvetov RLE Primenenie RLE kompaniej Microsoft dokumentirovano tolko dlya bitnostej 4 i 8 Pri eyo ispolzovanii v BITMAPINFO pole Compression dolzhno soderzhat 2 BI RLE4 pri bitnosti 4 ili 1 BI RLE8 s vosmibitnymi pikselyami Vysota rastra pri etom dolzhna byt ukazana polozhitelnym chislom V formate Windows Bitmap RLE kodirovanie mozhno sravnit s prorisovkoj prostymi komandami Prorisovka nachinaetsya s levogo nizhnego pikselya budte vnimatelnej v rastrah v celom privychnej mozhet byt verhnij levyj i osushestvlyaetsya vpravo i vverh Pikseli za predelami razmera rastra ne prorisovyvayutsya ob etom v dokumentacii ne skazano no GDI proyavlyaet takoe povedenie Instrukcii RLE pozvolyayut preryvat prorisovku gorizontali vsego izobrazheniya a takzhe peremeshat kursor prorisovki na druguyu poziciyu V rezultate nekotorye pikseli mogut okazatsya ne zarisovannymi Dokumentaciya yavno ne predusmatrivaet cveta dlya nezarisovannyh pikselej v rezultate chego traktovka mozhet varirovatsya propushennye pikseli libo ostayutsya prozrachnymi libo priobretayut cvet s indeksom 0 Esli delat pervoe dopushenie to mozhno govorit o tom chto 4 i 8 bitnye rezhimy blagodarya RLE kosvenno podderzhivayut prozrachnost no takoe povedenie ne garantirovano Formirovanie izobrazheniya pri RLE kodirovanii osushestvlyaetsya komandami Kazhdaya komanda obyazatelno dolzhna nachinatsya s chyotnogo adresa vyravnena na 16 bitnuyu granicu Sushestvuet pyat komand kotorye opredelyayutsya paroj bajt Bajt 1 hex Bajt 2 hex Opisanie 01 FF 00 FF Nachinaya s tekushej pozicii i dalee vpravo prorisovat stolko pikselej skolko ukazano v pervom bajte Znacheniya dlya pikselej berutsya iz vtorogo bajta V 8 bitnyh BMP ves bajt celikom yavlyaetsya znacheniem V 4 bitnyh iz nego po ocheredi beryotsya snachala starshij a potom mladshij nibbl chetvyorka bit 00 00 Peremestit kursor v nachalo samoe levo sleduyushej verhnej gorizontali 00 01 Prekratit prorisovku dostignut konec 00 02 Peremestit kursor vpravo i vverh na ukazannye v sleduyushih dalee dvuh bajtah znacheniya V pervom sleduyushem bajte soderzhitsya znachenie dlya gorizontalnogo sdviga a v sleduyushem dlya vertikalnogo Oba znacheniya celye bezznakovye chisla vlevo i vniz sdvinut nelzya 00 03 FF S tekushej pozicii i dalee vpravo zarisovat pikseli znacheniyami kotorye idut posle etoj pary bajt Vo vtorom bajte komandy soderzhitsya kolichestvo pikselej kotoroe nuzhno zakrasit imenno pikselej a ne bajt V 8 bitnom rastre beryotsya potok bajt kak est V 4 bitnom schityvaetsya uzhe nibbly starshie 4 bita iz bajta dlya pervogo pikselya mladshie 4 bita dlya sleduyushego i tak iz posleduyushih bajt Dannyj potok mozhet zakonchitsya nechyotnym kolichestvom bajt a komandy trebuyut 16 bitnogo vyravnivaniya Esli eto proizoshlo to dopisyvaetsya dopolnitelnyj bajt ego soderzhimoe znacheniya ne imeet Kogda dostigaetsya pravyj kraj gorizontali to na sleduyushuyu perevod ne proizvoditsya Poetomu nuzhno specialno vstavlyat komandu okonchaniya ryada I kak vidno iz tablicy nabor komand ne pozvolyayut dvigatsya vniz ili vernutsya nazad v gorizontali Poetomu mozhno prekrashat prorisovku esli budet dostignut verhnij kraj Vstraivanie dannyh v formatah JPEG i PNG Nachinaya s versij Windows 98 ME i 2000 XP sistemnye funkcii pozvolyayut hranit pikseli v formatah JPEG i PNG Pro stepen podderzhki etih dvuh formatov sistemoj nichego ne izvestno Dlya vstraivaniya JPEG ili PNG nuzhno v BITMAPINFO obnulit pole BitCount a v Compression ukazat znachenie 4 BI JPEG ili 5 PI PNG Znachenie polya SizeImage v dannom sluchae budet ravno razmeru JPEG ili PNG fajla kotoryj vstraivaetsya na mesto pikselnyh dannyh kak est Shirina zhe s vysotoj v zagolovke ukazyvayutsya uzhe dlya raskodirovannogo izobrazheniya Pro znak polya Height imenno dlya etogo sluchaya v dokumentacii napryamuyu nichego ne skazano no sudya po vsemu nuzhno zapisyvat otricatelnoe znachenie Razreshenie izobrazheniya Dlya sopostavleniya bezrazmernyh pikselej s materialnymi razmerami ispolzuyutsya polya XPelsPerMeter i YPelsPerMeter V etih polyah celym chislom ukazyvaetsya skolko v dannom izobrazhenii pikselej prihoditsya na odin linejnyj metr otdelno po gorizontali XPelsPerMeter i vertikali YPelsPerMeter Microsoft obyavila eti dva polya chislovym tipom so znakom no v dokumentacii nichego ne skazano pro otricatelnye znacheniya Pro znachenie nol takzhe nichego ne skazano no logichnej ego prinimat za neopredelyonnoe razreshenie kogda ono neizvestno ili ne imeet znacheniya Razreshenie chasto ukazyvaetsya s privyazkoj ne k metricheskim razmernostyam a v tochkah na dyujm DPI PPI Dlya perevoda tuda i obratno dyujm prinimaetsya ravnym 25 4 mm anglijskij dyujm Matematicheskie formuly dlya perevoda pikseli dyujm PPI v pikseli metr PPM i naoborot P P M P P I 25 4 1000 displaystyle PPM frac PPI 25 4 1000 P P I P P M 1000 25 4 displaystyle PPI frac PPM 1000 25 4 Esli interesuet tochnyj celochislennyj perevod to vyhodyat sleduyushie vyrazheniya i PPM i i PPI i 5000 64 127 i PPI i i PPM i 127 2500 5000 Posle nih okruglenie budet proizvedeno k blizhajshemu celomu Esli hotite okruglenie vniz to ne pribavlyajte polovinu delitelya Esli hotite vverh to pribavlyajte umenshennyj na edinicu delitel Nizhe predstavleny zaranee vychislennye znacheniya PPM dlya nekotoryh PPI DPI 96 ppi 3780 ppm dlya monitorov u Microsoft 72 ppi 2835 ppm Apple dlya monitorov 150 dpi 5906 ppm 300 dpi 11811 ppm 600 dpi 23622 ppm Cvetovoe prostranstvo V informacionnyh polyah osnovnym polem zadayushim cvetovoe prostranstvo yavlyaetsya pole CSType Dopustimye ego znacheniya privedeny v tablice nizhe Znachenie Versiya BITMAPINFO Imya konstanty Opisanie Hex Tekst 0 net 4 LCS CALIBRATED RGB Korrektirovka ishodya iz znachenij Endpoints GammaRed GammaGreen i GammaBlue 73524742 sRGB 4 LCS sRGB Ispolzuetsya cvetovoe prostranstvo sRGB 57696E20 Win 4 LCS WINDOWS COLOR SPACE Sistemnoe prostranstvo po umolchaniyu sRGB 4C494E4B LINK 5 PROFILE LINKED Cvetovoj profil v drugom fajle 4D424544 MBED 5 PROFILE EMBEDDED Vklyuchyonnyj v dannyj fajl cvetovoj profil Microsoft obyavila znacheniya konstant ne chislovymi znacheniyami a tekstovymi iz chetyryoh simvolov V dannom sluchae kody simvolov formiruyut bajty 32 bitnogo znacheniya ASCII kod samogo pravogo simvola yavlyaetsya mladshim bajtom kod samogo levogo starshim Pri prosmotre dvoichnogo soderzhimogo fajla v vide teksta takie znacheniya v kodirovke ASCII budut otobrazhatsya zadom naperyod naprimer KNIL a ne LINK Konechnye tochki i znachenie gammy Format Windows Bitmap pozvolyaet proizvodit cvetokorrekciyu ukazaniem konechnyh tochek dlya krasnogo zelyonogo i sinego cvetov a takzhe znachenij gammy Dlya etogo pole CSType dolzhno soderzhat znachenie 0 LCS CALIBRATED RGB Korrektiruyushie zhe znacheniya zapisyvayutsya v polya Endpoints GammaRed GammaGreen i GammaBlue pri drugih znacheniyah CSType eti chetyre polya ignoriruyutsya 36 bajtnoe pole EndPoints yavlyaetsya strukturoj CIEXYZTRIPLE kotoraya sostoit iz tryoh polej ciexyzRed konechnaya tochka krasnogo ciexyzGreen tochka zelyonogo i ciexyzBlue sinyaya Eti tri polya v svoyu ochered takzhe yavlyayutsya strukturami CIEXYZ s tremya polyami ciexyzX ciexyzY i ciexyzZ tipa FXPT2DOT30 PXPT2DOT30 eto 32 bitnoe bezznakovoe chislo s fiksirovannoj zapyatoj u kotorogo 2 starshih bita otvodyatsya pod celuyu chast a 30 mladshih pod drobnuyu Znachenie gammy zapisyvaetsya v sootvetstvuyushie polya dlya kazhdogo cvetovogo kanala otdelno GammaRed krasnyj GammaGreen zelyonyj i GammaBlue sinij V obyavlenii informacionnyh struktur Microsoft ukazala u dannyh polej tip DWORD V eto zhe vremya v fajle WinGDI h est bolee podhodyashee obyavlenie tipa FXPT16DOT16 na osnove tipa long kotoryj predstavlyaet soboj 32 bitnoe bezznakovoe chislo s drobnoj chastyu v mladshih 16 bitah i celoj v 16 starshih Sleduet otmetit chto v MSDN na stranicah pro struktury BITMAPV4HEADER i BITMAPV5HEADER tolko eto i skazano V state zhe pro strukturu LOGCOLORSPACE skazano chto u neyo v analogichnyh polyah dolzhny byt obnuleny starshij i mladshij bajt po suti vmesto formata 16 16 ispolzuetsya format 8 8 kotoryj raspolagaetsya v seredine 32 bitnoj yachejki Nizhe privedeny znacheniya ukazannyh vyshe chetyryoh polej v sootvetstvii s cvetovym prostranstvom sRGB Pole Znachenie Drobnoe Hex EndPoints ciexyzRed ciexyzX 0 64 28F5C28F EndPoints ciexyzRed ciexyzY 0 33 151EB852 EndPoints ciexyzRed ciexyzZ 0 03 01EB851F EndPoints ciexyzGreen ciexyzX 0 30 13333333 EndPoints ciexyzGreen ciexyzY 0 60 26666666 EndPoints ciexyzGreen ciexyzZ 0 10 06666666 EndPoints ciexyzBlue ciexyzX 0 15 0999999A EndPoints ciexyzBlue ciexyzY 0 06 03D70A3D EndPoints ciexyzBlue ciexyzZ 0 79 328F5C29 GammaRed GammaGreen GammaBlue 2 20 0002199A Cvetovoj profil V fajle BMP pri neobhodimosti mozhet byt ukazan cvetovoj profil kak neposredstvennym vklyucheniem tak i ssylkoj na drugoj fajl Profili poyavilis v pyatoj versii BMP i poka tolko zdes est specialnye dlya nih polya Podderzhivayutsya zhe cvetovye profili tolko v formate ICC Pri ispolzovanii cvetovyh profilej v pervuyu ochered nuzhno ukazat sleduyushie znacheniya polya CSType 4C494E4B16 PROFILE LINKED esli ispolzuetsya profil v drugom fajle 4D42454416 PROFILE EMBEDDED esli profil neposredstvenno vstraivaetsya v BMP V lyubom sluchae v pole ProfileData ukazyvaetsya smeshenie profilya v bajtah ot nachala bloka BITMAPINFO Esli profil vstroennyj to v ProfileSize nuzhno ukazat ego razmer v bajtah esli on podklyuchaemyj to eto pole dolzhno byt obnuleno Nezavisimo ot varianta Microsoft rekomenduet razmeshat profil pri hranenii v fajle za pikselnymi dannymi a v operativnoj pamyati pri vzaimodejstvii s WinAPI funkciyami srazu za zagolovkom Format ICC v svoyom zagolovke ispolzuet preimushestvenno 32 bitnye ili kratnye etomu razmeru yachejki Ishodya iz etogo esli profil neposredstvenno vklyuchaetsya v BMP to v operativnoj pamyati ego rekomenduetsya hranit po kratnomu chetyryom bajtam adresu Kogda profil vneshnij to vmesto ego soderzhimogo v BMP razmeshaetsya tekstovaya stroka s putyom k fajlu On obyazatelno dolzhen byt v odnobajtovoj kodirovke Windows 1252 standartnaya kodirovka dlya zapadnoevropejskih yazykov i zakanchivatsya nulevym bajtom Pro razdeliteli komponentov puti v dokumentacii nichego ne skazano i poetomu skoree vsego mozhno ispolzovat kak levye sleshi tak i pravye Put zhe mozhet byt kak otnositelnym tak i polnym i setevym I tak kak v ukazanii puti ispolzuetsya odnobajtovaya kodirovka to etu stroku v operativnoj pamyati vyravnivat ne obyazatelno Predpochteniya pri renderinge Predpochteniya pri renderinge angl rendering intents byli vvedeny Mezhdunarodnym koncorciumom po cvetu International Color Consortium i opredelyayut prioritety v sluchae kogda pri perehode iz cvetovogo podprostranstva podderzhivaemogo odnim ustrojstvom angl gamut v podprostranstvo drugogo v izobrazhenii ispolzovany cveta otsutstvuyushie v celevom Takzhe est opredelenie ot ICC kotoroe opredelyaetsya predpochteniya pri renderinge kak stil sopostavleniya cvetovyh znachenij iz odnogo opisatelya izobrazheniya v drugoe original na anglijskom yazyke style of mapping colour values from one image description to another Korporaciya Microsoft vklyuchila v format BMP specialnoe pole Intent kotoroe mozhet prinimat znacheniya polnostyu po specifikacii ICC Poetomu za podrobnoj informacii obrashajtes k dokumentacii konsorciuma poslednyuyu versiyu kotoroj mozhno skachat s sajta color org U Microsoft zhe eti predpochteniya korotko opisany v state Rendering Intents na MSDN Predpochtenie ukazyvaetsya v pole Intent bloka BITMAPINFO i dostupny tolko s 5 j versiej informacionnyh polej Znacheniya zhe mogut byt sleduyushimi Znachenie Imya konstanty dlya BMP Nazvanie ICC Nazvanie Microsoft Konstanta iz fajla Icm h Konstanta dlya DEVMODE 1 LCS GM BUSINESS saturation Graphic INTENT SATURATION 2 DMICM SATURATE 1 2 LCS GM GRAPHICS media relative colorimetric Proof INTENT RELATIVE COLORIMETRIC 1 DMICM COLORIMETRIC 3 4 LCS GM IMAGES perceptual Picture INTENT PERCEPTUAL 0 DMICM CONTRAST 2 8 LCS GM ABS COLORIMETRIC ICC absolute colorimetric relative colometric Match INTENT ABSOLUTE COLORIMETRIC 3 DMICM ABS COLORIMETRIC 4 Microsoft dlya dannoj harakteristiki obyavila kak minimum tri nabora konstant kotorye otlichayutsya svoimi znacheniyami i ispolzuyutsya v raznyh mestah Zdes oni privedeny na sluchaj esli vam nuzhno budet bystro ih sopostavit Znacheniya konstant s prefiksom INTENT polnostyu sovpadayut s temi znacheniyami kotorye ispolzuyutsya v fajlah profilej ICC Konstanty s prefiksom DMICM obyavleny v fajle WinGDI h dlya struktury DEVMODE Konstanty LCS GM kotorye ispolzuyutsya v BMP obyavleny tam zhe i prednaznacheny v pervuyu ochered dlya struktury LOGCOLORSPACE Est takzhe nazvaniya dlya svojstv printerov Oni analogichny tem chto v kolonke Nazvanie Microsoft no s Graphics i Pictures Za znachenie po umolchaniyu kotoroe v pervuyu ochered podhodit dlya fotografij i kartinok mozhno prinimat 4 LCS GM IMAGES V takom kachestve ego rekomenduet kak Microsoft tak i ICC Primer programmy na CSleduyushaya programma otkryvaet 24 bitnyj BMP fajl v okne XWindow glubina cveta dolzhna sostavlyat 32 bita na menshej cvetoperedache ne rabotaet tak kak eto uslozhnyaet primer Kompiliruetsya strokoj cc o xtest xtest c I usr X11R6 include L usr X11R6 lib lX11 lm include lt X11 Xlib h gt include lt X11 Xutil h gt include lt X11 Xatom h gt include lt X11 keysym h gt include lt stdlib h gt include lt stdio h gt include lt errno h gt include lt sys stat h gt include lt unistd h gt include lt fcntl h gt include lt math h gt include bitmap h Zdes opredeleniya zagolovkov BMP kak bylo opisano vyshe v etoj state struktury dolzhny byt upakovany na 2 bajta static XImage CreateImageFromBuffer Display unsigned char int int main int argc char argv Display dis Window win Nashe okno XEvent event Sobytiya GC gc Graficheskij kontekst XImage image int n width height fd size unsigned char data BITMAPFILEHEADER bmp BITMAPINFOHEADER inf char buf if argc lt 2 perror use xtest file bmp n exit 1 if fd open argv 1 O RDONLY 1 printf Error open bitmap n exit 1 read fd amp bmp sizeof BITMAPFILEHEADER read fd amp inf sizeof BITMAPINFOHEADER width inf biWidth height inf biHeight if dis XOpenDisplay getenv DISPLAY NULL printf Can t connect X server s n strerror errno exit 1 win XCreateSimpleWindow dis RootWindow dis DefaultScreen dis 0 0 width height 5 BlackPixel dis DefaultScreen dis WhitePixel dis DefaultScreen dis XSetStandardProperties dis win argv 1 argv 0 None argv argc NULL gc DefaultGC dis DefaultScreen dis Inogda v strukture eto mesto ne zapolneno if inf biSizeImage 0 Vychislim razmer size width 3 width 4 size size height else size inf biSizeImage buf malloc size if buf NULL perror malloc exit 1 printf size d bajtov vydeleno n size Smestimsya na nachalo samogo izobrazheniya lseek fd bmp bfOffBits SEEK SET Chitaem v bufer n read fd buf size printf size d bajt prochitano n n image CreateImageFromBuffer dis buf width height Udalim bufer on nam bolshe ne nuzhen free buf XMapWindow dis win XSelectInput dis win ExposureMask KeyPressMask while 1 XNextEvent dis amp event if event xany window win switch event type case Expose XPutImage dis win gc image 0 0 0 0 image gt width image gt height break case KeyPress if XLookupKeysym amp event xkey 0 XK q XDestroyImage image XCloseDisplay dis close fd exit EXIT SUCCESS break default break Sozdaet Ximage iz fajla BMP tak kak izobrazhenie BMP hranitsya pervernutym i zerkalnym v cikle eto ispravlyaetsya XImage CreateImageFromBuffer Display dis unsigned char buf int width int height int depth screen XImage img NULL int i j int numBmpBytes size t numImgBytes int32 t imgBuf int ind 0 int line int temp int ih iw Nomera stroki i stolbca dlya otrazheniya int new ind Novyj indeks screen DefaultScreen dis depth DefaultDepth dis screen temp width 3 line temp width 4 Dlina stroki s uchetom vyravnivaniya numImgBytes 4 width height imgBuf malloc numImgBytes Razmer otvedennyj na BMP v fajle s uchetom vyravnivaniya numBmpBytes line height for i 0 i lt numBmpBytes i unsigned int r g b Propuskaem padding if i gt temp amp amp i line gt temp continue b buf i i g buf i i r buf i Vychislyaem novyj indeks dlya otrazheniya po vertikali iw ind width ih ind width new ind iw height ih 1 width imgBuf new ind r g lt lt 8 b lt lt 16 lt lt 8 ind img XCreateImage dis CopyFromParent depth ZPixmap 0 char imgBuf width height 32 0 XInitImage img Poryadok bitov i bajtov na PC dolzhen byt takim img gt byte order MSBFirst img gt bitmap bit order MSBFirst return img Sm takzheICO format fajlov rodstvennyj format ot Microsoft dlya hraneniya znachkov i kursorov myshi Primechaniyahttp fileformats archiveteam org wiki BMP https www iana org assignments media types image bmp Leonard S Windows Image Media Types angl IETF 2016 12 p doi 10 17487 RFC7903 http www digitalpreservation gov formats fdd fdd000189 shtml https msdn microsoft com en us library dd183391 aspx Evchenko A I OpenGL i DirectX Programmirovanie grafiki Dlya professionalov 2006 g S 183 Sm razdel Remarks stati BITMAPV5HEADER structure ot 21 marta 2014 na Wayback Machine na MSDN Sm razdel Remarks v state BITMAPINFO structure ot 27 fevralya 2014 na Wayback Machine na MSDN Sm statyu Bitmap Header Types ot 22 sentyabrya 2014 na Wayback Machine v MSDN Informaciya o versiyah vzyata iz spravki po Microsoft Windows SDK idushaya v komplekte s Microsoft Visual Studio 2008 i Embarcadero RAD Studio 2010 razdel Requirements v statyah pro dannye struktury Sm razdely Requirements v statyah BITMAPCOREHEADER ot 16 sentyabrya 2014 na Wayback Machine i BITMAPINFOHEADER ot 19 aprelya 2014 na Wayback Machine primenitelno k Windows Mobile 6 5 na MSDN Imya polya bV4V4Compression s udvoennym V4 ukazano v dokumentaciyah i obyavlenii struktury v fajle WinGDI h smotrite naprimer BITMAPV4HEADER structure ot 11 oktyabrya 2013 na Wayback Machine na MSDN Microsoft obyavila polya Gamma s tipom DWORD no pri etom v GDI est specialnyj dlya takih polej tip FXPT16DOT16 Sm razdel Remarks v state BITMAPINFOHEADER ot 19 aprelya 2014 na Wayback Machine rubrika Windows Mobile 6 5 na MSDN Sm razdel Remarks v state Image Pixel Format Constants ot 4 maya 2014 na Wayback Machine rubrika GDI na MSDN V MSDN v samom nachale razdela Remarks stranicy struktury BITMAPV5HEADER ot 11 oktyabrya 2013 na Wayback Machine est predlozhenie If bV5Height is negative indicating a top down DIB bV5Compression must be either BI RGB or BI BITFIELDS perevod Esli bV5Height otricatelnyj oboznachaya DIB vida sverhu vniz to bV5Compression dolzhen byt libo BI RGB libo BI BITFIELDS Zdes vozmozhno ne utochnili chto eto kasaetsya tolko RLE kodirovaniya tak kak v odnom iz primerov prorisovki JPEG rastra ukazyvaetsya imenno otricatelnaya vysota ishite stroku bmi bmiHeader biHeight v state Testing a Printer for JPEG or PNG Support ot 14 noyabrya 2013 na Wayback Machine na MSDN Budte vnimatelny V MSDN v state BITMAPINFOHEADER ot 19 aprelya 2014 na Wayback Machine dlya Windows Mobile 6 5 v opisanii k polyu biClrUsed est predlozhenie If biBitCount equals 16 or 32 the optimal color palette starts immediately following the three DWORD masks perevod Esli biBitCount ravno 16 ili 32 to optimalnaya cvetovaya palitra nachinaetsya sleduya srazu za tremya DWORD maskami V etoj zhe state vyshe v opisanii k polyu biCompression skazano Specifies that the bitmap is not compressed and that the color table consists of three DWORD color masks i nizhe analogichnoe s consists of four DWORD color masks perevody Ukazyvaet chto bitmap ne szhat i chto tablica cvetov sostoit iz tryoh cvetovyh DWORD masok i sostoit iz chetyryoh cvetovyh DWORD masok Analogichnaya informaciya soderzhitsya v state BITMAPINFOHEADER structure ot 9 fevralya 2014 na Wayback Machine dlya Windows 9x NT Vsyo eto mozhno interpretirovat tak chto v bitnosti 16 i 32 za informacionnymi polyami strukturoj BITMAPINFOHEADER obyazatelno prisutstvuyut tri 32 bitnyh maski dlya izvlecheniya znachenij cvetovyh kanalov Pri etom esli Compression soderzhit 3 BI BITFIELDS ili 6 BI ALPHABITFIELDS to za nimi dobavlyaetsya eshyo tri ili chetyre analogichnyh maski kotorye v svoyu ochered zanimayut tablicu cvetov delaya nevozmozhnym ispolzovanie 16 bitnyh indeksov optimalnyh cvetov v logicheskoj palitre vozmozhno pri etom v pole biClrUsed nuzhno zapisat znachenie 6 ili 8 a v biClrImportant obyazatelno 0 chtoby dopolnitelnye maski sluchajno ne obrabotalis kak indeksy v palitre V dejstvitelnosti vsyo neskolko inache V dokumentacii MSDN na stranice Bitmap Header Types ot 22 sentyabrya 2014 na Wayback Machine est predlozhenie Bitmaps that are 1 4 or 8 bpp must have a color table with a maximum size based on the bpp perevod Bitmapy s bitnostyu 1 4 ili 8 dolzhny soderzhat tablicu cvetov s maksimalnym sootvetstvuyushim bitnosti razmerom Eto yavno oshibka i pisavshij primenil usloviya struktury CORE u kotoroj dejstvitelno dolzhen byt maksimum sm razdel Remarks v state BITMAPCOREINFO structure ot 3 maya 2015 na Wayback Machine ko vsem ostalnym versiyam struktur V drugoj state BITMAPINFO structure ot 24 iyunya 2014 na Wayback Machine pro tablicu cvetov skazano The number of entries in the array depends on the values of the biBitCount and biClrUsed members of the BITMAPINFOHEADER structure perevod kolichestvo elementov v massive zavisit ot znachenij polej biBitCount i biClrUsed struktury BITMAPINFOHEADER a v statyah struktur versij 3 4 5 sm naprimer BITMAPV5HEADER structure ot 11 oktyabrya 2013 na Wayback Machine v opisanii polya BitCount vezde napisano the bmiColors member of BITMAPINFO contains up to 256 entries analogichno pro drugie bitnosti perevod frazy chlen bmiColors BITMAPINFO soderzhit do 256 elementov Sm naprimer opisaniya k bitnostyam 16 i 32 u polya bV5BitCount v state BITMAPV5HEADER structure ot 11 oktyabrya 2013 na Wayback Machine na MSDN Na MSDN i spravke Microsoft Windows SDK v state BITMAPINFOHEADER structure ot 9 fevralya 2014 na Wayback Machine v opisanii znacheniya 16 polya biBitCount est sbivayushee s tolku predlozhenie All the bits in the pixel do not have to be used perevod Ne zadejstvovat vse bity v piksele Eto opechatka napisali have vmesto need kotoraya otsutstvuet v analogichnom bloke v state pro pyatuyu versiyu ot 11 oktyabrya 2013 na Wayback Machine v chetvyortoj eto predlozhenie otsutstvuet Dannaya informaciya est v spravke po Microsoft Windows SDK kotoraya idyot v komplekte vmeste s krupnymi IDE Sm Image Pixel Format Constants ot 4 maya 2014 na Wayback Machine pro GDI v MSDN Sm PixelFormat Enumeration ot 23 iyunya 2013 na Wayback Machine pro NET Framework 1 1 v MSDN Sm razdel Remarks ot 24 iyunya 2014 na Wayback Machine v state BITMAPINFO na MSDN V dokumentacii naprimer v state BITMAPV5HEADER structure ot 11 oktyabrya 2013 na Wayback Machine na MSDN skazano chto nulevoj razmer mozhno ukazyvat pri znachenii 0 BI RGB polya Compression Ochevidno chto eto primenimo i k znacheniyam 3 BI BITFIELDS i 6 BI ALPHABITFIELDS tak kak oni vnosyat razlichie lish vo vnutrennyuyu strukturu pikselej a ne v ih razmer Po svoej suti odin v odin kak v strukture RGBQUAD kotoraya ispolzuetsya v tablice cvetov Na MSDN v state BITMAPV4HEADER structure ot 11 oktyabrya 2013 na Wayback Machine upominaetsya tolko odno znachenie polya CSType LCS CALIBRATED RGB Polnyj spisok dostupnyh znachenij dlya versij 4 i 5 mozhno posmotret v state Using Structures in WCS 1 0 ot 3 maya 2015 na Wayback Machine Zdes posle Win idyot eshyo probel Ispolzovanie takogo stilya znachenij konstant tolko v pole CSType yavlyaetsya skoree vsego rezultatom vliyaniya specifikacii ICC u kotoroj v fajlah cvetovyh profilej 32 bitnym metkam angl tags znacheniya vydany analogichno Sm razdel Remarks v state LOGCOLORSPACE Structure ot 14 aprelya 2013 na Wayback Machine na MSDN Chisla vzyaty iz standarta A Standard Default Color Space for the Internet sRGB ot 20 avgusta 2011 na Wayback Machine Vse znacheniya okruglyalis vverh esli byl ustanovlen samyj pervyj otbroshennyj prava bit S obnulyonnym mladshim bajtom budet znachenie 00001A0016 okrugleno vverh Opisanie dannogo formata est v specifikacii ICC 1 2010 ssylka na kotoruyu est v konce dannoj stati Sm razdel Remarks stati BITMAPV5HEADER structure ot 11 oktyabrya 2013 na Wayback Machine na MSDN Sm statyu Using Structures in WCS 1 0 ot 3 maya 2015 na Wayback Machine na MSDN Sm razdel 7 2 Profile header v specifikacii ICC 1 2010 Opredelenie dano v specifikacii ICC 1 2010 v razdele 3 1 27 na s 21 V versii 4 3 specifikacii poslednyaya na moment napisaniya stati dannaya tema shiroko osveshaetsya v razdelah 0 4 Rendering intents vo vstuplenii s 8 6 2 Rendering intent v osnovnom soderzhimom s 26 i D 6 Discussion of colorimetric intents v prilozheniyah s 109 Sopostavleniya konstant vzyaty iz fajla Icm h zakommentirovannyj blok pryamo nad obevleniyami konstant INTENT Sm razdel 7 2 15 Rendering intent field bytes 64 to 67 specifikacii ICC Sm razdel Picture Intent v state Rendering Intents ot 18 sentyabrya 2012 na Wayback Machine na MSDN V specifikacii vnizu stranicy 41 LiteraturaMicrosoft MSDN i SDK Microsoft Windows SDK komplekt dlya razrabotchikov kotoryj vklyuchaet v sebya spravku i vklyuchaemye fajly na yazyke C Po teme dannoj stati aktualny fajly WinGDI h i Icm h iz kotoryh byli vzyaty v pervuyu ochered znacheniya konstant Poslednyuyu versiyu dannogo komplekta mozhno besplatno skachat s sajta Microsoft v dannoj state ispolzovalis versii 6 0 i 7 1 U Microsoft net otdelnoj specialnoj dokumentacii imenno po formatu BMP No ego struktury i prochie elementy opisany v ramkah podsistemy GDI Eto opisanie est v spravke kotoraya vklyuchaetsya v vysheupomyanutoe SDK a takzhe na MSDN Prichyom v poslednem ona prisutstvuet dlya raznyh platform i nezavisimo v spravke po Visual Studio V bolshinstve sluchaev tam predstavlena identichnaya informaciya no v nekotoryh mestah mozhet byt nemnogo bolshe faktov naprimer v spravke SDK bolshe informacii o podderzhke Windows Osnovnaya informaciyu nahoditsya v spravke po GDI kotoraya otnositsya k platformam Windows 9x i NT Ssylki na stranicy etogo razdela kotorye otnosyatsya tolko k formatu a ne k WinAPI funkciyam raboty s nim Bitmap Classifications opisanie apparatno zavisimyh i apparatno nezavisimyh bitmapov Bitmap Storage obshee opisanie formata fajla BMP Bitmap Header Types obzor po versiyam zagolovkov BMP Bitmap Compression opisanie RLE kodirovaniya Bitmap Structures razdel s opisaniyami struktur s polyami Dlya udobstva pryamye ssylki na klyuchevye BITMAPFILEHEADER BITMAPCOREHEADER BITMAPINFOHEADER BITMAPV4HEADER BITMAPV5HEADER U platform Windows Compact 2013 CE 6 0 i Mobile 6 5 est tolko opisaniya tryoh struktur no primenitelno k dannym platformam BITMAPFILEHEADER BITMAPCOREHEADER BITMAPINFOHEADER Ssylki na drugie stranicy iz MSDN kotorye otnosyatsya k formatu BMP Image Pixel Format Constants konstanty formatov pikselej GDI PixelFormat Enumeration opisanie znachenij perechislyaemogo tipa PixelFormat dlya NET Framework 1 1 samaya rannyaya versiya Using Structures in WCS 1 0 pro ispolzuemye v upravlenii cvetom v Windows struktury Rendering Intents opisanie predpochtenij pri renderinge Drugie V specifikacii ICC po upravleniyu cvetom mozhno najti informaciyu o cvetovyh profilyah v tom chisle o formate fajlov ICC a takzhe o predpochteniyah renderinga Dannuyu specifikaciyu mozhno skachat s oficialnogo sajta koncorciuma color org V moment napisaniya stati poslednej versiej byla 4 3 dekabr 2010 Pryamaya ssylki na PDF s sajta ICC Specification ICC 1 2010 Profile version 4 3 0 0 Image technology colour management Architecture profile format and data structure Errata k specifikacii obnaruzhennye oshibki i opechatki opublikovany 24 sentyabrya 2013 goda