BMP: различия между версиями
[непроверенная версия] | [непроверенная версия] |
Kodikent (обсуждение | вклад) →BITMAPINFOHEADER: оформление, дополнение |
Rei-bot (обсуждение | вклад) м робот добавил: fi:BMP (tiedostomuoto) изменил: en:Bitmap image |
||
Строка 230: | Строка 230: | ||
[[cs:BMP]] |
[[cs:BMP]] |
||
[[de:Windows Bitmap]] |
[[de:Windows Bitmap]] |
||
[[en:Bitmap |
[[en:Bitmap image]] |
||
[[es:Windows bitmap]] |
[[es:Windows bitmap]] |
||
[[fi:BMP (tiedostomuoto)]] |
|||
[[fr:Windows bitmap]] |
[[fr:Windows bitmap]] |
||
[[gl:BMP]] |
[[gl:BMP]] |
Версия от 04:48, 20 августа 2007
BMP (или DIB — device-independent bitmap) — формат хранения графических изображений (от англ. bit map). Глубина цвета от 1 до 48 бит на пиксель. Возможно сжатие без потерь по алгоритму RLE.
Обзор структуры файла
BMP-файл состоит из четырёх частей:
- Заголовок файла (BITMAPFILEHEADER)
- Заголовок изображения (BITMAPINFOHEADER, может отсутствовать). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
- Палитра (может отсутствовать)
- Само изображение
BITMAPFILEHEADER
Эта структура содержит информацию о типе, размере и сруктуре файла.
typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER, *PBITMAPFILEHEADER;
- bfType — тип файла, символы 'BM'.
- bfSize — размер файла в байтах.
- bfReserved1 и
- bfReserved2 — зарезервированы, содержат нули.
- bfOffBits — содержит смещение в байтах от начала структуры к данным изображения.
После заголовка файла
BITMAPINFOHEADER
- Наиболее простой вариант заголовка. Приложения для Windows NT3.51 и более ранних могут использовать только эту структуру.
typedef struct tagBITMAPINFOHEADER{ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER, *PBITMAPINFOHEADER;
- biSize — размер структуры в байтах
- biWidth — ширина изображения в пикселях. Для Win98/Me и Win2000/XP: если поле biCompression содержит BI_JPEG или BI_PNG, здесь указана ширина распакованного изображения.
- biHeight — высота изображения в пикселях. Если содержит положительное значение — изображение записано в порядке снизу вверх, нулевой пиксель в нижнем левом углу. Если значение отрицательное — изображение записано сверху вниз, нулевой пиксель в верхнем левом углу изображения. Поле biCompression должно содержать значение BI_RGB или BI_BITFIELDS. Такое изображение не может быть сжато.
- biPlanes — содержит единицу.
- biBitCount — указывает количество бит на пиксель. Может принимать следующие значения:
- 0 — имеет смысл для Win98/Me/2000/XP/. Число бит на пиксель определяет формат JPEG или PNG.
- 1 — изображение монохромное. Член bmiColors структуры BITMAPINFO содержит два элемента. Каждый бит изображения представляет один пиксель; если бит равен нулю — пиксель имеет цвет первого элемента таблицы bmiColors, иначе — цвет второго.
- 4 — шестнадцатицветное изображение. Пиксели определяются 4-х битными индексами, каждый байт изображения содержит информацию о двух пикселях — старшие 4 бита для первого, оставшиеся — для второго.
- 8 — в палитре содержится до 256 цветов, каждый байт изображения хранит индекс в палитре для одного пикселя.
- 16 — если поле biCompression содержит значение BI_RGB, файл не содержит палитры. Каждые два байта изображения хранят интенсивность красной, зеленой и синей компоненты одного пикселя. При этом старший бит не используется, на каждую компоненту отведено 5 бит: 0RRRRRGGGGGBBBBB.
- Если поле biCompression содержит значение BI_BITFIELDS, палитра хранит три двухбайтных значения, определяющих маску для каждой из трех компонент цвета. Каждый пиксель изображения представлен двухбайтным значением, из которого с помощью масок извлекаются цветовые компоненты. Для WinNT/2000/XP — последовательности бит каждой компоненты должны следовать непрерывно, не перекрываясь и не пересекаясь с последовательностями других компонент. Для Win95/98/Me — поддерживаются только следующие маски: 5-5-5, где маска синей компоненты 0х001F, зеленой 0x03E, красной 0x7C00; и 5-6-5, где маска синей компоненты 0x001F, зеленой 0x07E0, красной 0xF800.
- 24 — палитра не используется, каждая тройка байт изображения представляет один пиксель, по байту для интенсивности синего, зеленого и красного канала соответственно.
- 32 — Если поле biCompression содержит значение BI_RGB, изображение не содержит палитры. Каждые четыре байта изображения представляют один пиксель, по байту для интенсивности синего, зеленого и красного канала соответственно. Старший байт каждой четверки не используется.
- Если поле biCompression содержит значение BI_BITFIELDS, в палитре хранятся три четырехбайтных цветовых маски — для красной, зеленой и синей компоненты. Каждый пиксель изображения представлен четырьмя байтами. WinNT/2000: маски компонент не должны перекрываться или пересекаться. Windows 95/98/Me: система поддерживает только один режим сжатия, полностью аналогичный режиму без компрессии BI_RGB — старший байт каждой четверки не используется, следующие три отведены для синего, зеленого и красного канала соответственно.
- biCompression — указывает тип сжатия для сжатых изображений:
Значение | Идентификатор | Компрессия |
---|---|---|
0 | BI_RGB | несжатое изображение |
1 | BI_RLE8 | сжатие RLE для восьмибитных изображений |
2 | BI_RLE4 | сжатие RLE для четырехбитных изображений |
3 | BI_BITFIELDS | изображение не сжато, палитра содержит три четырехбайтные маски для красной, зеленой и синей компонент цвета. Используется для 16 и 32-битных изображений |
4 | BI_JPEG | Win98/Me/2000/XP: JPEG-сжатие |
5 | BI_PNG | Win98/Me/2000/XP: PNG-сжатие |
- biSizeImage — Указывает размер изображения в байтах. Может содержать ноль для BI_RGB-изображений. Win98/Me/2000/XP: если biCompression содержит BI_JPEG или BI_PNG, biSizeImage указывает размер BI_JPEG или BI_PNG буфера изображения.
- biXPelsPerMeter — указывает горизонтальное разрешение в пикселях на метр для целевого устройства. Приложение может использовать это значение для выбора из группы ресурсов изображения, наиболее подходящего для текущего устройства.
- biYPelsPerMeter — указывает вертикальное разрешение в пикселях на метр для целевого устройства.
- biClrUsed — указывает количество используемых цветовых индексов в палитре. Если значение равно нулю — изображение использует максимально доступное количество индексов, в соответствии со значением biBitCount и методом сжатия, указанным в biCompression.
Если содержит ненулевое значение и biBitCount меньше 16, biClrUsed указывает количество цветов, к которым будет обращаться драйвер устройства или приложение. Если biBitCount больше или равен 16, biClrUsed указывает размер палитры, используемой для оптимизации работы системных палитр. Если biBitCount равен 16 или 32, оптимальная палитра следует сразу после трех четырехбайтных маск. В упакованном изображении массив пикселей следует сразу после структуры BITMAPINFO, biClrUsed должен содержать ноль, либо реальный размер палитры.
- biClrImportant — указывает количество индексов, необходимых для отображения изображения. Если содержит ноль — все индексы одинаково важны.
Примечания: Структура BITMAPINFO объеденяет BITMAPINFOHEADER и палитру, предоставляя полное описание размеров и цветов изображения.
Чтобы найти палитру в структуре BITMAPINFO, приложение должно использовать информацию, хранимую в biSize, следующим образом:
pColor = ((LPSTR)pBitmapInfo + (WORD)(pBitmapInfo->bmiHeader.biSize));
BITMAPV4HEADER
- Расширенная версия описаной выше структуры. Win NT 3.51 и более ранние должны использовать структуру BITMAPINFOHEADER. Win98/Me/2000/XP могут использовать вместо структуры BITMAPV4HEADER структуру BITMAPV5HEADER.
typedef struct { DWORD bV4Size; LONG bV4Width; LONG bV4Height; WORD bV4Planes; WORD bV4BitCount; DWORD bV4V4Compression; DWORD bV4SizeImage; LONG bV4XPelsPerMeter; LONG bV4YPelsPerMeter; DWORD bV4ClrUsed; DWORD bV4ClrImportant; DWORD bV4RedMask; DWORD bV4GreenMask; DWORD bV4BlueMask; DWORD bV4AlphaMask; DWORD bV4CSType; CIEXYZTRIPLE bV4Endpoints; DWORD bV4GammaRed; DWORD bV4GammaGreen; DWORD bV4GammaBlue; } BITMAPV4HEADER, *PBITMAPV4HEADER;
Поля от начала структуры и до bV4ClrImportant включительно имеют то же назначение, что и соответствующие поля структуры BITMAPINFOHEADER.
- bV4RedMask — цветовая маска красной компоненты каждого пикселя, используется только если bV4Compression содержит значение BI_BITFIELDS.
- bV4GreenMask — цветовая маска зеленой компоненты каждого пикселя, используется только если bV4Compression содержит значение BI_BITFIELDS.
- bV4BlueMask — цветовая маска синей компоненты каждого пикселя, используется только если bV4Compression содержит значение BI_BITFIELDS.
- bV4AlphaMask — маска, определяющая компоненту альфа канала.
- bV4CSType — определяет цветовое пространство изображения.
- bV4Endpoints — структура LOGCOLORSPACE, указывающая x, y и z координаты трех цветов, которые соответствуют конечным точкам(endpoints) цветового пространства, определенного для изоражения. Это поле игнорируется, если bV4CSType не содержит значения LCS_CALIBRATED_RGB.
- bV4GammaRed — кривая тона красной компоненты. Игнорируется, если bV4CSType не содержит значения LCS_CALIBRATED_RGB. Указывается в формате 16^16.
- bV4GammaGreen — кривая тона зеленой компоненты. Игнорируется, если bV4CSType не содержит значения LCS_CALIBRATED_RGB.
- bV4GammaBlue — кривая тона синей компоненты. Игнорируется, если bV4CSType не содержит значения LCS_CALIBRATED_RGB.
BITMAPV5HEADER
- Win95/NT 4.0: приложения могут использовать BITMAPV4HEADER. Win NT 3.51 и более ранние должны использовать структуру BITMAPINFOHEADER.
typedef struct { DWORD bV5Size; LONG bV5Width; LONG bV5Height; WORD bV5Planes; WORD bV5BitCount; DWORD bV5Compression; DWORD bV5SizeImage; LONG bV5XPelsPerMeter; LONG bV5YPelsPerMeter; DWORD bV5ClrUsed; DWORD bV5ClrImportant; DWORD bV5RedMask; DWORD bV5GreenMask; DWORD bV5BlueMask; DWORD bV5AlphaMask; DWORD bV5CSType; CIEXYZTRIPLE bV5Endpoints; DWORD bV5GammaRed; DWORD bV5GammaGreen; DWORD bV5GammaBlue; DWORD bV5Intent; DWORD bV5ProfileData; DWORD bV5ProfileSize; DWORD bV5Reserved; } BITMAPV5HEADER, *PBITMAPV5HEADER;
Для полей от начала структуры и до bV5GammaBlue включительно будут описаны только отличия от предыдущих версий — BITMAPINFOHEADER и BITMAPV4HEADER.
- bV5CSType — определяет цветовое пространство изображения, может принимать следующие значения:
- LCS_CALIBRATED_RGB
- LCS_sRGB
- LCS_WINDOWS_COLOR_SPACE
- PROFILE_LINKED
- PROFILE_EMBEDDED
- bV5Intent — может принимать следующие значения:
- LCS_GM_ABS_COLORIMETRIC
- LCS_GM_BUSINESS
- LCS_GM_GRAPHICS
- LCS_GM_IMAGES
- bV5ProfileData — смещение в байтах от начала структуры к началу данных профиля(имя файла профиля, строка состоящая исключительно из символов кодовой таблицы 1252 и заканчивающаяся нулевым байтом). Игнорируется, если bV5CSType содержит значение, отличное от PROFILE_LINKED и PROFILE_EMBEDDED.
- bV5ProfileSize — размер данных профиля в байтах.
- bV5Reserved — зарезервировано. Содержит ноль.
Палитра
Палитра может содержать последовательность четырехбайтовых полей по числу доступных цветов (256 для 8-битного изображения). Три младшие байта каждого поля определяют интенсивность красной, зеленой и синей компоненты цвета, старший байт не используется. Каждый пиксель изображения описан в таком случае одним байтом, содержащим номер поля палитры, в котором сохранен цвет этого пикселя.
Если пиксель изображения описывается 16-битным числом, палитра может хранить три двухбайтных значения, каждое из которых пределяет маску для извлечения из 16-битного пикселя красной, зеленой и синей компонент цвета.
Файл BMP может не содержать палитры, если в нем хранится несжатое полноцветное изображение.
Данные изображения
Последовательность пикселей, записанных в том или ином виде. Каждая строка изображения дополняется нулями до длины, кратной четырем байтам.
Битность изображения
В зависимости от количества представляемых цветов, на каждую точку отводится от 1 до 48 битов:
- 1 бит — монохромное изображение (два цвета)
- 2 бита — редко используемый формат с 4 возможными цветами (один из режимов CGA)
- 4 бита — 16 цветное изображение, один из режимов работы VGA
- 8 бит (1 байт) — 256 цветов, последний из режимов, поддерживавших индексированные цвета (см ниже)
- 16 бит (2 байта) — режим Hi Color, 65536 возможных оттенков.
- 24 бита (3 байта) — True Color. В связи с тем, что 3 байта не очень хорошо соотносятся с степенями двойки, вместо него часто используют 32 битное изображение. В режиме True Color на каждый из трёх каналов (в режиме RGB) отводится по 1 байту (256 возможных значений), общее количество цветов равно 16777216.
- 32 бита (4 байта) — этот режим практически аналогичен True Color, четвёртый байт обычно используется для хранения альфа-канала.
- 48 бит (6 байт) — редко используемый формат с повышенной точностью передачи цвета, поддерживается относительно малым количеством программ и оборудования.
Индексированные цвета
При количестве бит от 1 до 8 на каждый пиксел может использоваться специальный режим индексированных цветов. В этом случае число, соответствующее каждому пикселу указывает не на цвет, а на номер цвета в палитре. Благодаря использованию палитры имеется возможность адаптировать изображение к цветам, присутствующим на изображении. В таком случае изображение ограниченно не заданными цветами, а максимальным количеством одновременно используемых цветов…
Ссылки
- Bitmap Storage Explanation (англ.)
- Описание формата BMP (рус.)
Это заготовка статьи о программном обеспечении. Помогите Википедии, дополнив её. |