|
|
Компьютеры - BMP - После заголовка файла04 июня 2011
Оглавление: 1. BMP 2. Обзор структуры файла 3. После заголовка файла 4. Палитра 5. Битность изображения 6. Индексированные цвета
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 указывает количество бит на пиксел. Может принимать следующие значения:
- имеет смысл для 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 старший байт каждой четвёрки используется в качестве альфа-канала, следующие три отведены для синего, зелёного и красного канала соответственно: 0xAARRGGBB .
- 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 = pBitmapInfo + );
Растр обычно хранится в вертикально зеркальном виде. Но есть также возможность хранить растр не в вертикально зеркальном виде. Признак того, что растр в BMP не в вертикально зеркальном виде задаётся параметром biHeight, определить зеркальный или нормальный растр и нормализовать параметр biHeight на BlitzPlus можно так:
If > 0
biHeight = ~biHeight + 1
BMP_Flipped = False
Else
BMP_Flipped = True
EndIf
Количество добавляемых в конце каждой строки выравнивающих 0...3 байт.
Вычесление Junk на BlitzPlus:
Вычесление Junk на Assembler:
ProcedureDLL DIB_Calc_Junk
! PUSH EDX
! MOV EAX,
! MUL dword
! NEG EAX
! SHR EAX, 32+3
! AND EAX, 3
! POP EDX
ProcedureReturn
EndProcedure
Длина строки в байтах без учёта Junk на BlitzPlus:
Длина строки в байтах без учёта Junk на Assembler:
ProcedureDLL DIB_Calc_LineSize
! PUSH EDX
! MOV EAX,
! MUL dword
! DEC EAX
! SHR EAX, 32+3
! INC EAX
! POP EDX
ProcedureReturn
EndProcedure
Длина строки в байтах с учётом Junk на BlitzPlus:
LineSizeJunk = LineSize + Junk
Длина строки в байтах с учётом Junk на Assembler:
ProcedureDLL DIB_Calc_LineJunkSize
! PUSH EDX
! MOV EAX,
! MUL dword
! DEC EAX
! SHR EAX, 32+3
! MOV EDX, EAX
! INC EDX
! NOT EAX
! AND EAX,3
! ADD EAX, EDX
! POP EDX
ProcedureReturn
EndProcedure
Размер всего растрового изображения без учёта Junk на BlitzPlus:
ImageSize = LineSize * biHeight
Размер всего растрового изображения с учётом Junk на BlitzPlus:
ImageSizeJunk = LineSizeJunk * biHeight
Значение ImageSizeJunk соответствует заявленому в заголовке значению biSizeImage.
Преобразование из вертикально зеркализированого в нормальный растр на BlitzPlus:
Function BMP_Flip
If or Then Return
Local tmp_BANK% = CreateBank
Local ADDR_1% = 0
Local ADDR_2% = - LineSizeJunk
For index=1 To
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, y и z координаты трёх цветов, которые соответствуют конечным точкам цветового пространства, определённого для изображения. Это поле игнорируется, если 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 смещение в байтах от начала структуры к началу данных профиля. Игнорируется, если bV5CSType содержит значение, отличное от PROFILE_LINKED и PROFILE_EMBEDDED.
- bV5ProfileSize размер данных профиля в байтах.
- bV5Reserved зарезервировано. Содержит ноль.
Просмотров: 6832
|