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