Масштабирование изображения
Некоторые приложения масштабируют изображение - то есть они показывают на экране изображение в уменьшенном или увеличенном виде. Например, рисующая прикладная программа может предусматривать функцию масштабирования, которая дает возможность пользователю просматривать и редактировать основу рисунка пиксель за пикселем.
Приложения масштабируют изображения при помощи вызова функцию 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;
|