Главная » 2D графика » Обзор формата DIB и компонентов для работы с ним

RSS

Обзор формата DIB и компонентов для работы с ним

Не нравитсяНравится   Рейтинг 0

Формат DIB

Независимо от того, хранится ли DIB в памяти или на диске, его структура практически одинакова. Фактически файл DIB состоит из последовательно расположенных структур нескольких типов. Это структуры BITMAPFILEHEADER , BITMAPINFO , BITMAPINFOHEADER и RGBQUAD. В последующих разделах рассматривается каждая из этих структур и ее использование в программах для Windows.

Структура BITMAPFILEHEADER

В начале файла DIB расположена структура BITMAPFILEHEADER. Приведу ее описание для Windows, взято из модуля windows.pas

1
2
3
4
5
6
7
8
PBitmapFileHeader = ^TBitmapFileHeader;
TBitmapFileHeader = packed record
  bfType: Word;
  bfSize: DWORD;
  bfReserved1: Word;
  bfReserved2: Word;
  bfOffBits: DWORD;
end;

Хотя данная структура располагается в начале файла на диске, она не обязана присутствовать в растрах, находящихся в памяти. Первое поле структуры, bfType, служит для идентификации файлов растровой графики и должно содержать ASCII-коды символов BM. В шестнадцатеричном виде значение bfType должно быть равно 4D42; в противном случае файл, вероятно, не содержит растрового изображения. Второе поле структуры, bfSize, должно содержать размер файла в байтах. Однако из-за ошибки в исходной документации Windows значение bfSize ненадежно и пользоваться им не следует. С другой стороны, вы вполне можете положиться на значение bfOffBits, в котором хранится смещение в байтах от начала растрового файла до массива данных. Структура BITMAPINFOHEADER кратко описана в таблице:

bfType WORD Содержит ASCII-коды символов «BM»
bfReserved1 WORD Всегда равен 0
bfReserved2 WORD Всегда равен 0
bfOffBits DWORD Смещение в байтах от начала файла до графических данных

Структура BITMAPINFO

За структурой BITMAPFILEHEADER следует структура BITMAPINFO. Приводится ее описание для Windows:

1
2
3
4
5
6
type PBitmapInfo = ^TBitmapInfo;
 
TBitmapInfo = packed record
  bmiHeader: TBitmapInfoHeader;
  bmiColors: array[0..0] of TRGBQuad;
end;

Как видите, эта структура состоит из заголовка в виде структуры BITMAPINFOHEADER и цветовой таблицы в виде массива структур RGBQUAD.

Структура BITMAPINFOHEADER

Теперь приведу описание структуры TBITMAPINFOHEADER для Windows:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PBitmapInfoHeader = ^TBitmapInfoHeader;
 
TBitmapInfoHeader = packed record
  biSize: DWORD;
  biWidth: Longint;
  biHeight: Longint;
  biPlanes: Word;
  biBitCount: Word;
  biCompression: DWORD;
  biSizeImage: DWORD;
  biXPelsPerMeter: Longint;
  biYPelsPerMeter: Longint;
  biClrUsed: DWORD;
  biClrImportant: DWORD;
end;

В поле biSize содержится размер структуры BITMAPINFOHEADER, который должен быть равен 40 байтам. Поля biWidth и biHeight содержат соответственно ширину и высоту растра в пикселях. biPlanes всегда присваивается значение 1. Число в поле biBitCount, обозначающее количество битов на пиксель, может быть равно 1, 4, 8 или 24, что соответствует монохромным, 16-цветным, 256-цветным и, наконец, полноцветным (16,7 миллиона цветов) изображениям. Обычно в играх используют 8 или 24-х битные растры.

Поле biCompression показывает тип сжатия (компрессии), использованного в растре; значение 0 означает отсутствие сжатия, 1 – сжатие по алгоритму RLE-8, а 2 – сжатие по алгоритму RLE-4. Если вы не знакомы с техникой сжатия данных, не стоит волноваться – в файлах DIB сжатие применяется редко. Обычно поле biCompression содержит 0.

Поле biSize содержит размер растра в байтах и, как правило, используется только для сжатых растров. При этом учитывается тот факт, что число байтов в каждой строке растра всегда кратно 4. При необходимости строки дополняются пустыми байтами. Однако, только если вы не пишете программу для создания DIB, вам не придется иметь дела с дополнением строк и трудностями, которые при этом возникают.

Поля biXPelsPerMeter и biYPelsPerMeter предназначены для указания количества пикселей на метр по горизонтали и вертикали, но обычно в них содержится 0. Поля biClrUsed и biClrImportant, задающие общее количество использованных цветов и количество значащих цветов соответственно, также обычно остаются равными 0.

Возможно, вы обратили внимание на то, что поля структуры BITMAPINFOHEADER, следующие после biBitCount, обычно равны 0, так что после чтения структуры из дискового файла на их значения полагаться не следует. В этой главе мы узнаем, как вычислить любые необходимые параметры – такие, как количество цветов, использованных в изображении, – и сохранить их в соответствующих полях структуры для будущего использования. Для удобства структура BITMAPINFOHEADER кратко описана в таблице:

biSize DWORD Размер данной структуры в байтах
biWidth DWORD Ширина растра в пикселях
biHeight DWORD Высота растра в пикселях
biPlanes WORD Всегда равен 1
biBitCount WORD Количество битов на пиксель
biCompression DWORD Тип сжатия: 0 = отсутствует, 1 = RLE-8, 2 = RLE-4
biSizeImage DWORD Размер растра в байтах
biXPelsPerMeter DWORD Количество пикселей на метр по горизонтали
biYPelsPerMeter DWORD Количество пикселей на метр по вертикали
biClrUsed DWORD Количество использованных цветов
biClrImportant DWORD Количество значащих цветов

Структура RGBQUAD

Описание последней структуры, RGBQUAD, приведено в листинге

1
2
3
4
5
6
PRGBQuad = ^TRGBQuad; TRGBQuad = packed record
  rgbBlue: Byte;
  rgbGreen: Byte;
  rgbRed: Byte;
  rgbReserved: Byte;
end;

В данной структуре всего лишь хранятся интенсивности красной, зеленой и синей составляющих цвета. Каждый цвет в DIB представлен отдельной структурой RGBQUAD. Таким образом, для 16-цветового (4-битного) растра цветовая таблица состоит из 16 структур RGBQUAD, а для 256-цветового (8-битного) цветовая таблица состоит из 256 структур RGBQUAD. Исключение составляют 24-битные изображения, в которых цветовая таблица вообще отсутствует.

За структурой BITMAPINFO в DIB следует массив с данными изображения. Его объем, конечно, зависит от размера изображения.

На последок еще раз приведу структуру DIB файла:

Теперь можно перейти к рассмотрению компонентов работающих с DIB структурами. Напомню что можно не использовать компоненты, а использовать обычные API функций ( их и используют все описанные ниже компоненты ). Но это не всегда удобно, т.к. иногда хочется получить некоторые дополнительные возможности, вроде поворота изображения, размытия и т.д. В данном обзоре будут рассмотрены 5 компонентов для работы с DIB.

Страницы : 1 2 3 4 5 6

Таги: ,