Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
экзамен СП.docx
Скачиваний:
13
Добавлен:
22.04.2019
Размер:
515.86 Кб
Скачать

Х.4 Растровая графика

Все рассмотренные выше функции базировались на вычерчивании определенными инструментами графических примитивов по заданным командам, т.е. по векторному принципу. Растровая графика предусматривает доступ (индивидуальном или "коллективном") к изображению на уровне образующих его точек, расположение которых не обязательно описывается в "векторном" виде. Оба типа графики обладают собственными достоинствами и недостатками и фактически тесно взаимосвязаны: для большинства устройств отображения первичен растровый принцип формирования изображения, но преобразования "инструментальных" примитивов в растр прозрачно для вызовов API.

Некоторые контексты поддерживают не все функции растровой графики. Информацию о совместимости может предоставить функция GetDeviceCaps().

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

Формат функций:

COLORREF SetPixel(HDC hDC, int nX, int nY, COLORREF crColor);

BOOL SetPixelV(HDC hDC, int nX, int nY, COLORREF crColor);

COLORREF GetPixel(HDC hDC, int nX, int nY);

Действие функций: соответственно изменение состояния (цвета) одной логической точки и получение текущего состояния. Функция SetPixelV() отличается тем, что приводит значение цвета к ближайшему представимому в данном контексте; согласно документации, выполняется несколько быстрее.

Возвращаемое значение: состояние точки на момент вызова функции (COLORREF) либо признак успешности выполнения (BOOL).

Параметры:

hDC – контекст

nX, nY – логические координаты точки

crColor – новое значение цвета точки.

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

Более сложные (и эффективные!) функции манипулируют не отдельными точками, а массивами точек – фрагментами изображений и битовыми образами.

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

Функции BitBlt, StretchBlt, MaskBlt, PlgBlt.

Формат функций:

BOOL BitBlt(

HDC hDstDC, int nDstX, int nDstY, int nDstWidth, int nDstHeight,

HDC hSrcDC, int nSrcX, int nSrcY,

DWORD dwRop

);

BOOL StretchBlt(

HDC hDstDC, int nDstX, int nDstY, int nDstWidth, int nDstHeight,

HDC hSrcDC, int nSrcX, int nSrcY, int nSrcWidth, int nSrcHeight,

DWORD dwRop

);

BOOL MaskBlt(

HDC hDstDC, int nDstX, int nDstY, int nDstWidth, int nDstHeight,

HDC hSrcDC, int nSrcX, int nSrcY,

HBITMAP hbmMask, int nMaskX, int nMaskY,

DWORD dwRop

);

BOOL PlgBlt(

HDC hDstDC, const POINT* lpDstVertices,

HDC hSrcDC, int nSrcX, int nSrcY,

HBITMAP hbmMask, int nMaskX, int nMaskY,

DWORD dwRop

);

Действие функций: перенос прямоугольного фрагмента изображения из контекста-источника в контекст-приемник, в т.ч. с трансформацией и дополнительными операциями (см. ниже). Фрагмент в логической системе координат. StretchBlt() отличается тем, что может изменять масштаб изображения фрагмента. MaskBlt() позволяет задавать маскировать часть изображения. PlgBlt(), кроме того, осуществляет перенос в непрямоугольную область приемника с соответствующим искажением.

Возвращаемое значение: признак успешности выполнения.

Параметры:

hSrcDC, hDstDC – контексты: соответственно источник и получатель данных.

nSrcX, nSrcY, nDstX, nDstY – координаты фрагмента в обоих контекстах.

nSrcWidth, nSrcHeight, nDstWidth, nDstHeight – размеры фрагментов.

hbmMask – битовый образ (см. ниже) маски, монохромного типа, нулевые точки маски указывают на применение к данной точке изображения операции "заднего плана", единичные – "переднего плана".

nMaskX, nMaskY – точка привязки в образе маски.

lpDstVertices – массив структур POINT, задающих вершины параллелограмма, образующего фрагмент-приемник.

dwRop – дополнительная операция, применяемая к фрагменту при переносе: SRCCOPY (простое копирование), SRCAND (комбинация цветов источника и получателя по И), SRCPAINT (комбинация по ИЛИ), SRCINVERT (комбинация по "Исключающему ИЛИ"), SRCERASE (комбинация по И цвета источника и инверсии цвета получателя), NOTSRCCOPY, NOTSRCERASE (соответствует одноименным, но результирующий цвет инвертируется), DSTINVERT (инверсия фрагмента-приемника), BLACKNESS, WHITENESS (заполнение фрагмента-получателя цветом соответственно 0 и 1 физической палитры), и другие. Для MaskBlt() параметр включает операции для переднего и заднего фона, формируется с помощью макроса MAKEROP4.

Для успешного применения этих функций требуется, чтобы оба контекста относились к одному устройству (или идентичным устройствам).

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

Эффекты, возникающие при деформации битового образа, дополнительно управляются функцией SetStretchBltMode(). Текущая настойка возвращается функцией GetStretchBltMode().

Битовый образ (bitmap) – двумерный массив числовых значений, характеризующий состояние точек некоторой области, как правило, прямоугольной.

В простейшем случае битовый образ описывается структурой BITMAP, содержащей поля:

LONG bmType – тип образа, должен быть равен 0.

LONG bmWidth, LONG bmHeight – положительные ширина и высота прямоугольной области в пикселах

LONG bmWidthBytes – размер в байтах образа одной строки изображения, в Windows должен быть кратен 2, т.к. система предполагает массив состоящим из слов; фактически кратен 4.

WORD bmPlanes – количество цветовых планов (плоскостей), фактически компонент, задающих цвет.

WORD bmBitsPixel – количество бит для кодирования цвета одной точки.

LPVOID bmBits – указатель на двумерный массив данных, каждая строка которого соответствует одной строке изображения.

Практически используются монохромный и цветной типы образов. В случае монохромного имеет место 1 цветовой план и 1 бит на точку. Единичное значение этого бита задает для точки цвет переднего плана (foreground), нулевое – заднего (backgroung).

С точки зрения GDI битовые образы являются объектами, которые идентифицируются их описателями – HBITMAP. Различают т.н. совместимые и контекстно-независимые объекты BITMAP.

Битовый образ типично создается одной из следующих функций.

Функции CreateBitmap, CreateBitmapIndirect

Формат функций:

HBITMAP CreateBitmap(

int nWidth, int nHeight, UINT cPlanes, UINT cBitsPerPel,

const void* lpvBits

);

HBITMAP CreateBitmapIndirect(const BITMAP* lpBitmap);

Действие: создает объект BITMAP с указанными характеристиками.

Возвращаемое значение: описатель объекта или NULL в случае ошибки.

Параметры:

nWidth, nHeight – размеры образа в точках изображения (pel).

cPlanes – количество цветовых планов.

cBitsPerPel – "глубина" цвета и битах на точку.

lpvBits – массив данных образа.

lpBitmap – структура BITMAP, содержащая перечисленные параметры.

Функция CreateDIBitmap

Формат функции:

HBITMAP CreateDIBitmap(

);

Действие: создает объект BITMAP контекстно-независимого типа.

Возвращаемое значение: описатель объекта или NULL в случае ошибки.

Параметры:

Функция CreateCompatibleBitmap

Формат функции:

HBITMAP CreateCompatibleBitmap(HDC hDC, int nWidth, int nHeight);

Действие: создает объект BITMAP совместимого типа для заданного контекста с заданными размерами. В зависимости от контекста он может быть создан цветным или монохромным, а если в контексте заданы данные раздела DIB – контекстно-независимым.

Возвращаемое значение: описатель объекта или NULL в случае ошибки.

Параметры:

hDC – контекст.

nWidth, nHeight – размеры образа.

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

Для доступа к содержимому битового образа предусмотрены функции SetDlBits() и GetDlBits() (работают построчно). Однако имеется возможность воздействовать на него всеми доступными инструментами. Для этого объект BITMAP связывается с некоторым контекстом с помощью универсальной функции SelectObject(), после чего все изменения в контексте будут отображаться и в битовом образе; наиболее характерным примером является использование контекстов "в памяти", связывать с которыми объект BITMAP необходимо. Аналогично для отображения битового образа в контекст он должен быть связан с некоторым контекстом (возможно, с одним и тем же).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]