Масштабирование изображения
Некоторые приложения масштабируют изображение - то есть они показывают на экране изображение в уменьшенном или увеличенном виде. Например, рисующая прикладная программа может предусматривать функцию масштабирования, которая дает возможность пользователю просматривать и редактировать основу рисунка пиксель за пикселем.
Приложения масштабируют изображения при помощи вызова функцию StretchBlt. Подобно функции BitBlt, StretchBlt копирует растровые данные из точечного рисунка в источниковом DC в точечный рисунок в целевом DC. Однако, в отличие от функции BitBlt, StretchBlt масштабирует изображение, основываясь на заданных размерах исходных и целевых прямоугольников. Если исходный прямоугольник является большим, чем целевой прямоугольник, получающееся в результате изображение будет казаться сжатым; если исходный прямоугольник является меньшим, чем целевой прямоугольник, получающееся в результате изображение будет казаться растянутым.
Если целевой прямоугольник является меньше, чем исходный прямоугольник, функция StretchBlt удаляет данные о цвете из изображения согласно заданному режиму растяжения как показано в нижеследующей таблице.
| Режим растяжения | Метод |
|---|---|
| BLACKONWHITE | Выполняет логическую операцию И (AND) на данных о цвете для устранения пикселей и на данных о цвете для оставшихся пикселей. |
| WHITEONBLACK | Выполняет логическую операцию ИЛИ (OR) на данных о цвете для устранения пикселей и на данных о цвете для оставшихся пикселей. |
| COLORONCOLOR | Ликвидирует данные о цвете удаленных пикселей полностью. |
| HALFTONE | Подбирает близкое значение к исходным данным о цвете в объекте назначения. |
Вы устанавливаете режим растяжения при помощи вызова функции SetStretchBltMode.
Код примера ниже получен из прикладной программы, которая показывает на экране изображение или в его первоначальном размере, или вдвое больше его первоначального размера. (Это приложение использует режим растяжения заданный по умолчанию.)
hdcScaled = CreateCompatibleDC(hdcScreen);
hbmScaled = CreateCompatibleBitmap(hdcScreen,
GetDeviceCaps(hdcScreen, HORZRES) * 2,
GetDeviceCaps(hdcScreen, VERTRES) * 2);
if (hbmScaled == 0)
errhandler("hbmScaled", hwnd);
// Выберем точечный рисунок в совместимый DC.
if (!SelectObject(hdcScaled, hbmScaled))
errhandler("Scaled Bitmap Selection", hwnd);
case WM_COMMAND: // сообщение: команда из меню приложения
switch(wParam)
{
case IDM_SCALEX1:
if (fBlt)
{
fScaled = FALSE;
hdcWin = GetDC(hwnd);
BitBlt(hdcWin,
0,0,
bmp.bmWidth, bmp.bmHeight,
hdcCompatible,
0,0,
SRCCOPY);
ReleaseDC(hwnd, hdcWin);
}
break;
case IDM_SCALEX2:
if (fBlt)
{
fScaled = TRUE;
StretchBlt(hdcScaled,
0, 0,
bmp.bmWidth * 2, bmp.bmHeight * 2,
hdcCompatible,
0, 0,
bmp.bmWidth, bmp.bmHeight,
SRCCOPY);
hdcWin = GetDC(hwnd);
BitBlt(hdcWin,
0,0,
bmp.bmWidth, bmp.bmHeight,
hdcScaled,
0,0,
SRCCOPY);
ReleaseDC(hwnd, hdcWin);
}
break;
|