Обзор формата 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

                    
                    
                    
                    
                    
                    


