티스토리 뷰

Computer/Win32 API

[Win32] StretchBlt 함수

jamezc 2013. 7. 22. 17:00

StretchBlt 함수


이미지의 크기를 조절하여 화면에 출력해주는 함수입니다.


BitBlt 함수에서 불가능한 이미지 크기를 조절해서 출력할 수 있습니다.


이미지 크기를 조절할 때 생가는 색상의 손실을 SetStretchBltMode 함수를 사용하여 보정하는 것이 좋습니다.


이 함수를 쓰기 전에 먼저 비트맵 파일을 LoadImage 함수나 다른 방법을 이용하여 불러와야 합니다.




함수 원형


BOOL StretchBlt(

    HDC hdcDest,

    int nXOriginDest,

    int nYOriginDest,

    int nWidthDest,

    int nHeightDest,

    HDC hdcSrc,

    int nXOriginSrc,

    int nYOriginSrc,

    int nWidthSrc,

    int nHeightSrc,

    DWORD dwRop);




인수


hdcDest

이미지를 출력할 위치의 핸들입니다.


nXOriginDest, nYOriginDest

이미지를 출력할 위치인 x, y 좌표입니다.


nWidthDest, nHeightDest

출력할 이미지의 너비, 높이입니다.

이 크기만큼 hdcSrc로부터 받은 이미지를 이 너비와 높이에 맞게 이미지 크기를 변경합니다.


hdcSrc

이미지의 핸들입니다.


nXOriginSrc, nYOriginSrc

가져올 이미지의 시작지점인 x, y좌표입니다.

지정한 위치부터 nWidthSrcnHeightSrc만큼 이미지를 잘라옵니다.


nWidthSrc, nHeightSrc

원본 이미지로부터 해당 크기만큼 잘라낼 이미지의 너비, 높이입니다.

이 크기만큼 원본 이미지에서 잘라내어 nWidthDestnHeightDest의 크기에 맞게 이미지 크기를 변경합니다.


dwRop

이미지의 출력 방법입니다.


 값

 설명

 BLACKNESS

 이미지를 원본의 색이 아닌 검은색으로 채웁니다.

 DSTINVERT

 지정된 이미지와는 상관없이 화면의 색상을 반전시킵니다.

 MERGECOPY

 이미지의 색상과 현재 선택된 브러시를 AND 연산자를 사용하여 병합합니다.

 MERGEPAINT

 반전된 이미지와 화면의 색을 OR 연산자를 사용하여 병합합니다.

 NOMIRRORBITMAP

 Prevents the bitmap from being mirrored.

 NOTSRCCOPY

 이미지의 색상을 반전시킵니다.

 NOTSRCERASE

 화면과 이미지를 OR 연산자를 사용하여 합친 다음 색상을 반전시킵니다.

 PATCOPY

 현재 선택된 브러시를 출력합니다.

 PATINVERT

 현재 선택된 브러시 색과 화면을 XOR 연산자를 사용하여 결합합니다.

 PATPAINT

 현재 선택된 브러시 색과 반전된 원본 이미지를 OR 연산자를 사용하여 결합합니다.

 그다음 OR 연산자를 사용하여 화면과 결합합니다.

 SRCAND

 화면과 이미지를 AND 연산자를 사용하여 결합합니다.

 SRCCOPY

 원본 이미지를 출력합니다.

 SRCERASE

 반전된 화면과 이미지를 AND 연산자를 사용하여 결합합니다.

 SRCINVERT

 화면과 이미지를 XOR 연산자를 사용하여 결합합니다.

 SRCPAINT

 화면과 이미지를 OR 연산자를 사용하여 결합합니다.

 WHITENESS

 이미지를 원본의 색이 아닌 하얀색으로 채웁니다.




요구 사항


 운영체제

 Windows 2000 이상

 헤더

 Wingdi.h (include Windows.h)

 라이브러리

 Gdi32.lib

 DLL

 Gdi32.dll




예제


이 예제는 WinMain의 기본 구성에서 WndProc 부분에 그대로 복사하시면 됩니다.


난잡해서 이해가 잘 안가신다면 첨부파일을 참고해주세요.


//---------------------------------------------------------//

// 프로그램의 실질적이고 고유한 처리를 하는 곳

//---------------------------------------------------------//

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

    HDC hdc;

    PAINTSTRUCT ps;

    HDC hMemDC;

     HBITMAP hImage, hOldBitmap;

    int bx, by;

    BITMAP bit;

    LPCWSTR str;


    switch (iMessage)

    {

    case WM_PAINT:

        hdc = BeginPaint(hWnd, &ps);

        hMemDC = CreateCompatibleDC(hdc); // 메모리 DC를 만든다


        // 비트맵 속성으로 파일을 불러오고 HBITMAP으로 형변환해서 hImage에 저장한다

        // fuLoad 속성: 리소스 대신 파일명으로, 호환 비트맵이 아닌 DIB 섹션 비트맵으로 불러온다

        hImage = (HBITMAP) LoadImage(NULL, TEXT("image.bmp"),

             IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);


        // hImage가 선택되기 전의 핸들을 저장해 둔다

        hOldBitmap = (HBITMAP) SelectObject(hMemDC, hImage);


        // 비트맵 정보를 알아낸다

        GetObject(hImage, sizeof(BITMAP), &bit);

        bx = bit.bmWidth;

        by = bit.bmHeight;


        // 원본

        str = TEXT("원본");

        TextOut(hdc, 50, 30, str, lstrlen(str));


        BitBlt(hdc, 50, 50, bx, by, hMemDC, 0, 0, SRCCOPY);


        // 1.5

        str = TEXT("1.5");

        TextOut(hdc, 450, 30, str, lstrlen(str));


        StretchBlt(hdc, 450, 50, bx * 1.5, by * 1.5, hMemDC, 0, 0, bx, by, SRCCOPY);


        // 1.5배 / 0.5배 설명

        str = TEXT("1.5/ 0.5");

        TextOut(hdc, 50, 360, str, lstrlen(str));


        // BLACKONWHITE(기본 설정)

        str = TEXT("BLACKONWHITE(기본 설정)");

        TextOut(hdc, 50, 380, str, lstrlen(str));


        SetStretchBltMode(hdc, BLACKONWHITE);

        StretchBlt(hdc, 50, 400, 100, 100, hMemDC, 120, 70, 70, 70, SRCCOPY); // 부분 확대

        StretchBlt(hdc, 155, 400, bx * 0.5, by * 0.5, hMemDC, 0, 0, bx, by, SRCCOPY); // 축소


        // COLORONCOLOR

        str = TEXT("COLORONCOLOR");

        TextOut(hdc, 450, 380, str, lstrlen(str));


        SetStretchBltMode(hdc, COLORONCOLOR);

        StretchBlt(hdc, 450, 400, 100, 100, hMemDC, 120, 70, 70, 70, SRCCOPY);

        StretchBlt(hdc, 555, 400, bx * 0.5, by * 0.5, hMemDC, 0, 0, bx, by, SRCCOPY);


        // HALFTONE

        str = TEXT("HALFTONE");

        TextOut(hdc, 50, 530, str, lstrlen(str));


        SetStretchBltMode(hdc, HALFTONE);

        StretchBlt(hdc, 50, 550, 100, 100, hMemDC, 120, 70, 70, 70, SRCCOPY);

        StretchBlt(hdc, 155, 550, bx * 0.5, by * 0.5, hMemDC, 0, 0, bx, by, SRCCOPY);


        // WHITEONBLACK

        str = TEXT("WHITEONBLACK");

        TextOut(hdc, 450, 530, str, lstrlen(str));


        SetStretchBltMode(hdc, WHITEONBLACK);

        StretchBlt(hdc, 450, 550, 100, 100, hMemDC, 120, 70, 70, 70, SRCCOPY);

        StretchBlt(hdc, 555, 550, bx * 0.5, by * 0.5, hMemDC, 0, 0, bx, by, SRCCOPY);


        SelectObject(hMemDC, hOldBitmap); // hImage 선택을 해제하기 위해 hOldBitmap을 선택한다

        DeleteObject(hImage); // 선택 해제된 비트맵을 제거한다

        DeleteDC(hMemDC); // 메모리 DC를 제거한다

        EndPaint(hWnd, &ps);

        return 0;


    case WM_DESTROY:

        PostQuitMessage(0);

        return 0;

    }

    // WinProc에서 처리하지 않는 나머지 메시지를 윈도우 기본으로 처리하도록 전달

    return(DefWindowProc(hWnd, iMessage, wParam, lParam));

}




결과


* 이미지를 클릭해서 원본으로 보세요.





출처: http://msdn.microsoft.com/en-us/library/windows/desktop/dd145120(v=vs.85).aspx

댓글

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음



Total
Today
Yesterday
최근에 달린 댓글