Обзор формата DIB и компонентов для работы с ним
Что такое DIB ?
Если вы когда-либо занимались программированием для Windows, то наверняка знаете, что растры (bitmaps) встречаются повсюду. Это происходит не только из-за того, что графический формат BMP является единственным, который непосредственно поддерживается Windows ( не считая значков (icons), возможности которых крайне ограничены). Просмотрите любое руководство по программированию для Windows, и вы найдете в нем такие функции, как CreateBitmap() , LoadBitmap() , StretchDIBits() и BitBlt() для создания, загрузки и вывода растров на экран, однако вы не обнаружите аналогичных функций для других графических форматов - например PCX, TIFF или GIF. Следовательно, вы не сможем сколько-нибудь заметно продвинуться в программировании игр для Windows, если не научитесь работать с растрами.
Аппаратно-зависимые и аппаратно-независимые растры
Аппаратно-зависимыми растрами называются графические изображения, которые могут отображаться лишь на графических устройствах определенного типа. Например, при работе с такими функциями Windows, как CreateBitmap() или LoadBitmap(), вы создаете в памяти растровое изображение, совместимое с некоторым устройством - обычно экраном монитора. Растры такого типа иногда называют растрами GDI, поскольку интерфейс графических устройств (GDI - Graphics Device Interface) системы Windows способен правильно работать с ними. Аппаратно-зависимые растры не содержат цветовых таблиц, поскольку в них используются цвета того устройства, с которым они связаны. Более того, аппаратно-зависимые растры обычно существуют только в памяти, а не в виде файлов на диске.
Аппаратно-независимыми растрами называются графические изображения, которые могут отображаться на устройствах различных типов. В таких растрах хранится цветовая таблица, используемая назначенным устройством для их отображения, чтобы в разных условиях они выглядели одинаково. Например, аппаратно-независимый растр должен под Windows казаться практически таким же, как и под DOS или OS/2. Поскольку аппаратно-независимые растры обычно являются переносимыми (portable) между различными системами, они часто сохраняются в виде файлов на диске. Например, если вы заглянете в папку Windows, то найдете там много файлов с расширением .BMP. В них хранятся аппаратно-независимые растры. Вы можете создавать свои собственные аппаратно-независимые растры с помощью разнообразных графических редакторов, среди которых - Windows Paint, имеющийся в каждой стандартной поставке Windows. Аппаратно-независимые растры часто называются DIB (от Device-Independed Bitmaps) - для краткости мы будем называть их именно так.
Формат DIB
Независимо от того, хранится ли DIB в памяти или на диске, его структура практически одинакова. Фактически файл DIB состоит из последовательно расположенных структур нескольких типов. Это структуры BITMAPFILEHEADER , BITMAPINFO , BITMAPINFOHEADER и RGBQUAD. В последующих разделах рассматривается каждая из этих структур и ее использование в программах для Windows.
Структура BITMAPFILEHEADER
В начале файла DIB расположена структура BITMAPFILEHEADER. Приведу ее описание для Windows, взято из модуля windows.pas 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:type PBitmapInfo = ^TBitmapInfo;
TBitmapInfo = packed record
bmiHeader: TBitmapInfoHeader;
bmiColors: array[0..0] of TRGBQuad;
end;
Как видите, эта структура состоит из заголовка в виде структуры BITMAPINFOHEADER и цветовой таблицы в виде массива структур RGBQUAD.
Структура BITMAPINFOHEADER
Теперь приведу описание структуры TBITMAPINFOHEADER для Windows: 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 Количество значащих цветов
Источник: http://www.delphigfx.narod.ru