Масштабирование картинки.
Масштабировать картинки можно при помощи
функции 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;
|