Заголовок файла (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;

Тип WORD должен иметь размер 16 биттипы DWORD і LONG 32 бита, тип LONG — знаковый порядок байтов имеется в виду little endian.

· bfType тип файла символы «BM» (у HEX: 0x42 0x4d).

· bfSize размер всего файла в байтах.

· bfReserved1 и bfReserved2 — зарезервированы, должны содержать нули.

· bfOffBits содержит смещение в байтах от начала структуры BITMAPFILEHEADER к непосредственно битов изображения.

BITMAPINFOHEADER http://ru.wikipedia.org/wiki/BMP - cite_note-1#cite_note-1

Наиболее простой вариант заголовка. Применение для 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, зеленой 0x03E0, красной 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 для 8-битных изображений
2 BI_RLE4   сжатие RLE для 4-битных изображений
3 BI_BITFIELDS   изображение не сжатое, палитра содержит три 4-байтные маски для красной, зеленой и синей компонент цвета. Используется для 16 - и 32-битных изображений
4 BI_JPEG   Win98/Me/2000/XP: JPEG-сжатия
5 BI_PNG   Win98/Me/2000/XP: PNG-сжатие
6 BI_ALPHABITFIELDS   WINCE: изображение не сжатое, палитра содержит четыре 4-байтные маски для красной, зеленой, синей и прозрачной (альфа-канал) компонент цвета. Используется для 16 - и 32-битных изображений

· 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));

Зерно обычно хранится в вертикально зеркальном виде. Но есть также возможность сохранять растр не в вертикально зеркальном виде. Признак того, что растр в BMP не в вертикально зеркальном виде задается параметром biHeight, определить зеркальный или нормальный растр и нормализовать параметр biHeight BlitzPlus можно так:

If| (biHeight| And| $80000000) > 0          biHeight| = ~biHeight + 1          BMP_Flipped| = False|Else|          BMP_Flipped| = True|EndIf|

Количество добавляемых в конце каждой строки выравнивающих 0...3 байта (они называются Junk, и значение их не важны) на BlitzPlus:

Junk = (~(biWidth * biBitCount - 1) Shr 3) And 3

Длина строки в байтах без учета Junk на BlitzPlus:

LineSize = 1 + ((biWidth * biBitCount - 1) Shr 3)

Длина строки в байтах с учетом Junk на BlitzPlus:

LineSizeJunk = LineSize + Junk

Размер всего растрового изображения без учета Junk на BlitzPlus:

ImageSize = LineSize * biHeight

Размер всего растрового изображения с учетом Junk (размер буфера изображения) на BlitzPlus:

ImageSizeJunk = LineSizeJunk * biHeight

Значение ImageSizeJunk соответствует заявленному в заголовке значению biSizeImage (в не сжатых BMP-файлов).

Преобразования с вертикально зеркализованого в нормальный растр на BlitzPlus:

Function| BMP_Flip|()If| (biHeight| = 1) or| (BMP_Flipped| = False|) Then| Return|Local| tmp_BANK%|  = CreateBank|(LineSizeJunk|)Local| ADDR_1%|                      = 0Local| ADDR_2%|                      = (biHeight| * LineSizeJunk|) - LineSizeJunk|For| index=1| To| (biHeight| Shr| 1)          CopyBank| bnk_BMP_IMG| ADDR_1|          tmp_BANK|      0        LineSizeJunk|          CopyBank| bnk_BMP_IMG| ADDR_2|          bnk_BMP_IMG| ADDR_1|          LineSizeJunk|          CopyBank| tmp_BANK|   0        bnk_BMP_IMG| ADDR_2|          LineSizeJunk|          ADDR_1| = ADDR_1| + LineSizeJunk|          ADDR_2| = ADDR_2| - LineSizeJunk|Next|FreeBank| tmp_BANK|End| Function|

 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 — структура CIEXYZTRIPLE, указуются x, у и 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-битового пикселя красной, зеленой и синей компонент цвета.


Дата добавления: 2018-10-27; просмотров: 408; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!