Битовые изображения в формате DDB

Виды растровых форматов

РАБОТА С РАСТРОВЫМИ ИЗОБРАЖЕНИЯМИ

К настоящему времени известно много форматов файлов для растровых изо­бражений. Здесь мы рассмотрим работу с одним из самых популярных форматов, кото­рый обязан своей распространенностью операционной системе Windows — формат BMP.

В операционной системе Windows используются два формата растровых (битовых) изображений – аппаратно-зависимый DDB (device-dependent bitmap) и аппаратно-независимый DIB (device-independent bitmap).

Согласно определению, данному в документации к SDK, битовое изображение DDB есть набор бит в оперативной памяти, который может быть отображен на устройстве вывода (например, выведен на экран видеомонитора или распечатан на принтере). Внутренняя структура изображения DDB жестко привязана к аппаратным особенностям устройства вывода. Поэтому представление изображения DDB в оперативной памяти полностью зависит от устройства вывода.

Для описания растровых изображений в ОС Windows используется структура BITMAP:

typedef struct tagBITMAP {

LONG bmType; // Тип битового изображения (= 0)

LONG bmWidth; // Ширина битового изображения в пикселах(> 0)

LONG bmHeight; // Высота битового изображения в пикселах (>0)

LONG bmWidthBytes; // Размер памяти, занимаемый одной строкой растра

// битового изображения.

WORD bmPlanes; // Количество плоскостей в битовом изображении

WORD bmBitsPixel; // Количество бит, используемых для представления

// цвета пиксела

LPVOID bmBits; // Указатель на массив, содержащий биты изображения

} BITMAP, *PBITMAP;

Если бы в Windows можно было работать только с изображениями DDB, было бы необходимо иметь отдельные наборы изображений для каждого типа видеоконтроллера и каждого видеорежима, что, очевидно, крайне неудобно.

Аппаратно-независимое битовое изображение DIB содержит описание цвета пикселов изображения, которое не зависит от особенностей устройства отображения. Операционная система Windows после соответствующего преобразования может отобразить такое изображение на любом устройстве вывода. Несмотря на некоторое замедление процесса вывода по сравнению с выводом изображений DDB, универсальность изображений DIB делает их весьма привлекательными для хранения изображений.

Как было сказано выше, битовые изображения в формате DDB являются аппаратно-зависимыми. Поэтому структура изображения в оперативной памяти зависит от особенностей аппаратуры.

Как правило, изображения DDB либо загружаются из ресурсов приложения, либо создаются непосредственно в оперативной памяти. Для вывода изображений DDB на экран используются такие функции, как BitBlt и StretchBlt.

Ниже приведено описание функций BitBlt и StretchBlt.

BOOL WINAPI BitBlt (

HDC hdcDest, // контекст для рисования

int nXDest, // x-координата верхнего левого угла

// области рисования

int nYDest, // y-координата верхнего левого угла

// области рисования

int nWidth, // ширина изображения

int nHeight, // высота изображения

HDC hdcSrc, // идентификатор исходного контекста

int nXSrc, // x-координата верхнего левого угла

// исходной области

int nYSrc, // y-координата верхнего левого угла

// исходной области

DWORD dwRop) // код растровой операции

Функция копирует битовое изображение из исходного контекста hdcSrc в контекст отображения hdcDest. Возвращаемое значение равно TRUE при успешном завершении или FALSE при ошибке.

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

Для рисования битовых изображений можно использовать вместо функции BitBlt функцию StretchBlt, с помощью которой можно выполнить масштабирование (сжатие или растяжение) битовых изображений:

BOOL WINAPI StretchBlt (

HDC hdcDest, // контекст для рисования

int nXDest, // x-координата верхнего левого угла

// области рисования

int nYDest, // y-координата верхнего левого угла

// области рисования

int nWidthDest, // новая ширина изображения

int nHeightDest, // новая высота изображения

HDC hdcSrc, // идентификатор исходного контекста

int nXSrc, // x-координата верхнего левого угла

// исходной области

int nYSrc, // y-координата верхнего левого угла

// исходной области

int nWidthSrc, // ширина исходного изображения

int nHeightSrc, // высота исходного изображения

DWORD dwRop) // код растровой операции

Параметры этой функции аналогичны параметрам функции BitBlt, за исключением того, что ширина и высота исходного и полученного изображения должна определяться отдельно. Размеры исходного изображения (логические) задаются параметрами nWidthSrc и nHeightSrc, размеры нарисованного изображения задаются параметрами nWidthDest и nHeightDest.

Возвращаемое значение равно TRUE при успешном завершении или FALSE при ошибке.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: