Функция StretchBlt

В процессе выполнения растровой операции три исходных изображения (битовых последовательности p, d, s) комбинируются и получается результирующее изображение. Код выполняемой операции задается параметром dwROP — индексом тернарной растровой операции.

С реального устройства на другое устройство.

С реального устройства в битмап;

Между двумя битмапами;

Между битмапом, выбранным в совместимый контекст устройства и реальным устройством на котором необходимо изображение показать;

Операции передачи образов

Приложение вызвало одну из функций работы с полосами прокрутки.

Клиентская область была полностью или частично закрыта другим окном или выпадающим меню, а теперь закрывающий объект исчез;

Изменились размеры или местоположение окна;

Использование сообщения WM_PAINT

Сообщение WM_PAINT система посылает окну во всех случаях, требующих перерисовки клиентской области окна, например при наступлении следующих событий:

Кроме того, приложение может само инициировать посылку сообщения WM_PAINT посредством вызова одной из функций InvalidateRect, InvalidateRgn или UpdateWindow.

Функция UpdateWindow посылает сообщение WM_PAINT непосредственно в оконную процедуру, минуя очередь сообщений приложения.


Операции по обмену блоками бит (b it b l ock t ransfer, BLT) или тернарные растровые операции (ternary raster operation) – механизм, осуществляющий передачу растровых изображений между различными контекстами устройств.

Основная идея растровых операций заключается в организации обмена данными между двумя контекстами устройств. В Windows-приложении можно осуществить передачу изображения:

GDI содержит 3 функции, осуществляющих такую передачу изображений — PatBlt, BitBlt и StretchBlt:

BOOL PatBlt(hDC, nX, nY, nWidth, nHeight, dwROP);

BOOL BitBlt(hDestDC, nDestX, nDestY, nDestWidth, nDestHeight, hSrcDC, nSrcX, nSrcY, dwROP);

BOOL StretchBlt(hDestDC, nDestX, nDestY, nDestWidth, nDestHeight, hSrcDC, nSrcX, nSrcY, nSrcWidth, nSrcHeight, dwROP);

Все три функции строят результирующее изображение на контексте–приемнике, используя в качестве исходных данных:

1. изображение, создаваемое на приемнике при закраске фона текущей кистью, выбранной в контекст–приемник (это называется образцом, pattern).

2. изображение, существующее на контексте–источнике (исходное изображение, source).

3. изображение, существующее в данный момент на контексте–приемнике (имеющееся изображение, destination).


Предположим, что биты, определяющие битмап совместимого контекста обозначают буквой S (source – источник, ресурс), биты заливки – буквой Р (pattern - образец), а биты, на которых будет прорисовываться изображение – буквой D (destination – назначение, место назначения). Операции, которые выполняются с битами S, P, D: а – побитовое И, n – побитовое НЕТ, о – побитовое ИЛИ, х – побитовое исключающее ИЛИ.

Х1 Х2 И Х1 НЕТ Х1 Х2 ИЛИ Х1 Х2 Исключающее ИЛИ

0 0 0 0 1 0 0 0 0 0 0

0 1 0 1 0 0 1 1 0 1 1

1 0 0 1 0 1 1 0 1

1 1 1 1 1 1 1 1 0

Обозначив знак операции как Ор, то действия с битами можно записать таким образом: PSОр. То есть необходимо взять пиксель паттерны и прорисовываемого битмапа и произвести над ними операцию (бинарная растровая операция). Если в операции участвует три операнда, то получим DPSОр1Ор2 (тернарная растровая операция).


Определить индекс операции PSx и DPSxx.

P 1 1 1 1 0 0 0 0

S 1 1 0 0 1 1 0 0

D 1 0 1 0 1 0 1 0

PSx 0 0 1 1 1 1 0 0 = 0x3c????

DPSxx 1 0 0 1 0 1 1 0 = 0x96????

DPx 0 1 0 1 1 0 1 0 = 5A????

В документации по SDK имеется таблица, перечисляющая индексы 256 возможных растровых операций, их имена и короткое пояснение к каждой операции. Имена присвоены только 15 наиболее употребляемым операциям. Таблица, представленная в документации имеет следующий вид:

Number Hex ROP Boolean function Common Name
      BLACKNESS
  ...    
0D 000D0B25 PDSnaon  
  ...    
       

Поле «Hex ROP» – индекс тернарной растровой операции (используется в качестве параметра dwROP).

Поле «Boolean function» содержит пояснение к выполняемой операции;

Поле «Common name» — имя растровой операции, если оно назначено.


Основные коды растровых операций приведены в таблице.


Скопировать bitmap с совместимого на основной контекст с масштабированием можно с помощью функции StretchBlt(). Эта функция описана следующим образом:

StretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD);

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

Первый и шестой аргументы функции – хэндлы окна (hDC) и совместимого контекста (hCompatibleDC) соответственно. Одиннадцатый аргумент функции StretchBlt() – это код растровой операции.

Первые пять аргументов описывают тот прямоугольник на экране, в который будет вписан битмап. Ту часть битмапа, которая будет вписана в прямоугольник на экране, описывают следующие пят аргументов.


При масштабировании, используя функцию StretchBlt возможно два случая:

– изображение увеличивается, то некоторые строки (столбцы) будут дублироваться;

– изображение уменьшается, то некоторые строки (столбцы) будут комбинироваться в одну строку (столбец).

Объединение строк (столбцов) при сжатии может осуществляться различными способами, которые выбираются с помощью функции:

UINT SetStretchBltMode(hDC, nMode);

параметр nMode задает режим объединения строк:

BLACKONWHITE выполняется операция И (AND). В результате получается, что черный цвет имеет "приоритет" над белым — сочетание черного с белым рассматривается как черный
WHITEONBLACK выполняется операция ИЛИ (OR). При этом "приоритет" принадлежит белому над черным — сочетание черного с белым дает белый
COLORONCOLOR при этом происходит простое исключение строк (столбцов).
HALFTONE 1 только в Win32 API; происходит усреднение цвета объединяемых точек.


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



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