Окт 16 2009

Загрузка DDB-растра из ресурсов приложения

В Windows-программировании DIB-растры (BMP-файлы) часто присоединяются к модулю в виде ресурса1, а затем загружаются в программу функцией LoadBitmap, которая преобразует растр к типу Н BITMAP:
HBITMAP LoadBitmap(
HINSTANCE hlnstance. // дескриптор экземпляра приложения
LPCTSTR IpBitmapName // имя растрового ресурса );
Имя ресурса может быть либо строкой с завершающим нуль-символом, например szBmpNamel, либо целочисленным идентификатором, например IDB_1. В первом случае параметру IpBitmapName передается адрес строки szBmpNamel, а во втором — выражение, преобразующее целочисленный идентификатор к типу LPCTSTR при помощи макроса MAKEINTRESOURCE, то есть параметр получает значение MAKEINTRES0URCE(IDB_1).
Растровые ресурсы хранятся в модулях Win32 в формате упакованного DIB-растра. Функция LoadBitmap находит растровый ресурс, загружает его в память, получает дескриптор упакованного DIB-растра и затем на его базе создает DDB-растр, совместимый с текущим экранным режимом.
Пример использования функции LoadBitmap можно найти в листинге 5.4 и в листинге 11.1.
Приложение может также вызвать функцию LoadBitmap для загрузки предопределенных в системе растров с изображениями различных кнопок, которые использует Win32 API. Для этого необходимо передать параметру hlnstance значение NULL, а второму параметру — одно из значений 0BM_BTNC0RNERS, OBM_BTSIZE и других аналогичных констант.


Окт 16 2009

Создание DDB-растра из упакованного DIB

так, рассмотренные выше функции мало пригодны для создания инициализированных цветных DDB-растров. В то же время аппаратно-независимыи растр обладает хорошими средствами для описания стандартных цветовых форматов. Поэтому GDI содержит функцию CreateDIBitmap, которая создает инициализированный DDB-растр на базе DIB, то есть, по существу, преобразует упакованный DIB в DDB. Функция имеет следующий прототип:
HBITMAP CreateDIBitmap(HDC hdc. CONST BITMAPINFOHEADER Ipbmih.
DWORD fdwlnit. CONST VOID Ipblnit, CONST BITMAPINFO Ipbmi. UINT fuUsage):
В своей реализации она сначала создает DDB-растр, совместимый с контекстом устройства hdc, а затем преобразует DIB в DDB. Параметр Ipbmih содержит адрес заголовка информационного блока DIB. Параметр fdwlnit определяет необходимость инициализации DDB-растра. Если он равен CBM_INIT, то следующие три параметра ссылаются на упакованный DIB-растр, используемый для инициализации. Параметр Ipblnit указывает на массив пикселов, а параметр Ipbmi — на заголовок информационного блока DIB, преобразованный к типу BITMAPINFO. Последний параметр, fuUsage, сообщает, содержит цветовая таблица индексы палитры (DIB_PAL_C0L0RS) или цвета RGB (DIB_RGB_C0L0RS).
Честно говоря, не совсем понятно, для чего нужна эта функция, поскольку если DIB-растр загружен, как, например, в коде листинга 3.6, то никаких проблем с его выводом не будет. Для этого вызывается функция StretchDIBits (в классе KDib она инкапсулирована в метод Draw). Функция CreateDIBitmap позволяет преобразовать этот же DIB-растр, предварительно загруженный в память, в объект DDB-растра, который затем может быть отображен при помощи функции BitBlt (подробности вывода DDB-растров рассматриваются ниже). Но остается вопрос: а что дает эта более сложная схема?
Все же основные способы создания DDB-растров сводятся к рассматриваемым ниже двум функциям.


Окт 16 2009

Аппаратно-зависимые растры

ппаратно-зависимый растр (DDB) представляет собой объект GDI, который функционирует под управлением GDI и драйверов устройств. Он обладает тем же статусом, что и объекты логического пера или логической кисти. При создании DDB-растра Windows определяет его внутренний формат и выделяет память из области памяти GDI. После этого все операции с растром выполняются через дескриптор объекта GDI, имеющий тип НBITMAP. DDB-растры также часто называют «растровыми объектами GDI». Напомним, что особенностью формата DDB является то, что система всегда создает битовый образ в памяти с учетом характеристик конкретного графического оборудования.


Окт 16 2009

Упакованный аппаратно-независимый растр

Если есть файл DIB, который следует загрузить в приложение, то можно считать его непосредственно в выделенный блок памяти. Такой блок называют упакованным {packed) DIB-растром. Он содержит все компоненты файла DIB, кроме заголовка bmfHeader. Таким образом, упакованный DIB-растр начинается с заголовка информационного блока bmi Header, за которым следуют массив масок, если он нужен, цветовая таблица (если она существует) и массив пикселов. В качестве указателя на упакованный DIB-растр в GDI обычно используется указатель на структуру BITMAPINFO. Следует отметить, что термин «упакованный» в данном случае не имеет никакого отношения к упаковке пикселов в строке развертки. Он просто означает, что компоненты DIB следуют друг за другом в смежных ячейках памяти.
Довольно большое количество функций, входящих в состав Win32 API, получает и возвращает упакованные DIB-растры. Кроме того, упакованные DIB-pac-тры используются в работе буфера обмена Windows.


Окт 16 2009

Массив пикселов

Пикселы изображения хранятся в массиве пикселов aBitmapBits. Если поле biHeight заголовка информационного блока содержит положительное значение, то строки развертки хранятся в обратном порядке, если же значение отрицательное — то в прямом порядке.
Пикселы упаковываются внутри строки развертки для экономии места. Строки дополняются битами до границы двойного слова.
Количество байтов на строку вычисляется по следующей формуле:
bytesPertine = ((width bitCount + 31) / 32) 4: где width — ширина изображения в пикселах, a bitCount — количество бит на пиксел.
Для несжатых растров DIB, у которых поле biCompression имеет значение BI_RGB, обращение к отдельным пикселам массива является простой операцией, которая реализуется достаточно эффективно. Массив пикселов aBitmapBits можно объявить как двумерный, что отражало бы семантику хранения в нем строк развертки изображения. Однако основные функции отображения DIB в контексте устройства получают в качестве аргумента адрес одномерного массива. Поэтому удобней объявлять aBitmapBits как одномерный массив, а прямой доступ к пикселам осуществлять посредством преобразования пары индексов «логического» двумерного массива в эквивалентный индекс «физического» одномерного массива.


Окт 16 2009

Цветовая таблица

Цветовая таблица является массивом структур типа RGBQUAD. Этот тип определен следующим образом:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreerr.
BYTE rgbRed;
BYTE rgbReserved; } RGBQUAD;
Поля структуры задают относительную интенсивность для синей, зеленой и красной составляющих цвета пиксела. Последнее поле в структуре является резервным.
Обычно цветовая таблица используется в DIB-растрах, содержащих не более 256 цветов. В этом случае каждый пиксел массива aBitmapBits содержит индекс в цветовой таблице. Иногда цветовую таблицу включают и в DIB-растры формата True Color (Hi Color), что, на первый взгляд, кажется избыточным. Но это позволяет отображать указанные растры с требуемым качеством передачи цветов на устройствах, не поддерживающих формат True Color, а работающих с цветовой палитрой.
Количество элементов в цветовой таблице задается в поле biClrUsed заголовка информационного блока. Если это поле имеет нулевое значение, то используется максимальное количество элементов для заданной цветовой глубины.


Окт 16 2009

Аппаратно-независимые растры

Аппаратно-независимые растры (DIB) содержат полную информацию об изображении, что позволяет правильно отображать изображение на самых различных устройствах. Обычно файлы, в которых сохраняется DIB, имеют расширение .Ьшр. Поэтому формат DIB-pacmpoe имеет альтернативное наименование «файловый формат BMP».


Окт 16 2009

Растры

Графические объекты, рассмотренные в главе 2, такие как пикселы, линии и замкнутые фигуры, могут использоваться для построения инженерных и финансовых диаграмм, чертежей, геометрических узоров и иных графических композиций. Геометрические фигуры в этих изображениях описываются точными математическими формулами. Соответствующая область программирования компьютерной графики называется векторной графикой (vector graphics).
В другой, не менее важной области компьютерной графики используются оцифрованные изображения, полученные из окружающего мира. Эта область называется растровой графикой (bitmap graphics). Обычно растровые изображения получают от таких устройств, как цифровой фотоаппарат, сканер, видеокамера, либо создают в каком-нибудь графическом редакторе, к которым относится, например, Microsoft Paint или Adobe Photoshop.
Растровый, или битовый, образ {bitmap) — это оцифрованное представление изображения. Каждый пиксел изображения представлен в растровом образе одним или несколькими битами, в которых закодирован его цвет. В монохромных битовых образах для хранения информации о каждом пикселе достаточно одного бита. Но для кодирования цветных изображений требуется более одного бита на пиксел. Число цветов, которые могут быть представлены в битовом образе, равно 2", где п — количество битов на пиксел. Например, для старой модели дисплея VGA с поддержкой 256 цветов битовые образы содержали по 8 битов на пиксел. Для современных мониторов, поддерживающих до 224 цветов, битовый образ должен содержать 24 бита на пиксел, когда для каждого RGB-компонента цвета используется 8 битов.
В ранних версиях Windows использовался только один формат битового образа, получивший позже наименование аппаратно-зависимого растра, или DDB (device dependent bitmap). Особенность формата DDB состоит в том, что система всегда создает битовый образ в памяти с учетом характеристик конкретного графического оборудования. Например, если компьютер оснащен 256-цветным дисплеем, то созданный битовый образ будет содержать по 8 битов на пиксел. Формат DDB не подходил для переноса растров на другие компьютеры, так как характеристики графических устройств изменяются в очень широких пределах. Более того, даже на одном компьютере дисплей может работать в разных режимах, в зависимости от текущих настроек экрана.
Начиная с Windows 3.0, был введен новый формат битовых образов, названный аппаратно-независимым растром, или DIB (device independent bitmap). Битовый образ DIB кроме самого массива пикселов содержит справочную информацию о растре и цветовую таблицу. В цветовой таблице отражается соответствие двоичного представления пикселов цветам RGB, поэтому битовые образы этого формата после сохранения в файле могут быть воспроизведены на любом растровом графическом устройстве. Если устройство, на которое переносится DIB, имеет более узкий диапазон поддерживаемых цветов, то цвета из таблицы преобразуются к ближайшим цветам, которые устройство может действительно воспроизвести.
В настоящее время аппаратно-зависимые растры (DDB) используются во внутренней работе графической системы Windows, а также для представления тех битовых образов в программе, которые не предназначены для передачи во внешний мир. Аппаратно-независимые растры (DIB), напротив, применяются для обмена битовыми образами между программами как в форме файлов, так и через буфер обмена Windows.
Мы начнем наше путешествие по растровой тематике с рассмотрения DIB, потом перейдем к DDB и в завершение познакомимся с новым типом растров, поддерживаемым в Win32 GDI, — DIB-секциями.


Окт 16 2009

Использование специализированной палитры

Бывают ситуации, когда применение полутоновой палитры не обеспечивает удовлетворительной передачи всех требуемых цветов. Это характерно для приложений, которым необходимо отображать множество оттенков одного и того же цвета.
Нетрудно показать на примере предыдущего приложения, что оно не справится с выводом даже восьми оттенков одного, например зеленого, цвета.


Окт 16 2009

Полутоновая палитра

тобы увеличить количество имеющихся цветов в палитре, можно воспользоваться полутоновой палитрой. Для этого необходимо выполнить следующие шаги:
1. Создать полутоновую палитру (функция CreateHalftonePalette).
2. Выбрать созданную палитру в контекст устройства (функция SelectPalette).
3. Реализовать палитру при помощи функции RealizePalette. Функция SelectPalette имеет следующий прототип:
HPALETTE SelectPaletteC
HDC hdc. // дескриптор контекста устройства
HPALETTE hpal. // дескриптор логической палитры
BOOL bForceBackground // режим (фоновый или основной) ):
Последний параметр функции определяет, в каком режиме — фоновом (TRUE) или основном (FALSE) — будет реализована палитра при вызове функции Realize Palette. Процесс реализации палитры в общих чертах был описан выше.
Следует уточнить, что в фоновом режиме функция RealizePalette пытается разместить логическую палитру привязкой к уже существующим цветам в системной палитре, подыскивая ближайшее соответствие. Это размещение делается всегда, независимо от того, активно ли данное приложение.
В основном режиме функция RealizePalette копирует логическую палитру в системную, за исключеним статических цветов, только тогда, когда приложение активно.
Логическая палитра hPal создается в блоке обработки сообщения WM_CREATE, а реализуется как в блоке обработки сообщения WM_QUERYNEWPALETTE, так и в блоке обработки сообщения WM_PALETTECHAN6ED. Функция Realize Palette возвращает количество цветов логической палитры, отображенных на системную палитру. Если это значение больше нуля, то вызывается функция InvalidateRect.
В блоке обработки сообщения WM_PAINT логическая палитра выбирается в контекст устройства, после чего вызываются функции рисования.
После запуска этой программы в 256-цветном режиме экрана вы должны увидеть картинку, практически совпадающую по качеству передачи цветов с той, которая была в режиме экрана True Color .


« Предыдущая страницаСледующая страница »