Масштабирование изображения


Некоторые приложения масштабируют изображение - то есть они показывают на экране изображение в уменьшенном или увеличенном виде. Например, рисующая прикладная программа может предусматривать функцию масштабирования, которая дает возможность пользователю просматривать и редактировать основу рисунка пиксель за пикселем.

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

 

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz