Интернет магазин китайских планшетных компьютеров



Компьютеры - 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 =  Shr 3) And 3

Вычесление 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:

LineSize = 1 +  Shr 3)

Длина строки в байтах без учёта 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 — зарезервировано. Содержит ноль.


Просмотров: 6617


<<< Bink
BSON >>>