Масштабирование картинки

Масштабировать картинки можно при помощи функции 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; 
 
« Предыдущая статья   Следующая статья »