15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


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

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