티스토리 뷰
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로부터 받은 이미지를 이 너비와 높이에 맞게 이미지 크기를 변경합니다. 이미지의 핸들입니다.
가져올 이미지의 시작지점인 x, y좌표입니다. 지정한 위치부터 nWidthSrc, nHeightSrc만큼 이미지를 잘라옵니다. nWidthSrc, nHeightSrc 원본 이미지로부터 해당 크기만큼 잘라낼 이미지의 너비, 높이입니다. 이 크기만큼 원본 이미지에서 잘라내어 nWidthDest, nHeightDest의 크기에 맞게 이미지 크기를 변경합니다. 이미지의 출력 방법입니다.
|
요구 사항
운영체제 | 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
[출처] StretchBlt 함수|작성자 히니즈
'Computer > Win32 API' 카테고리의 다른 글
[Win32] 일반적인 윈도우 소멸 순서 - WM_CLOSE, WM_DESTROY, WM_QUIT (0) | 2015.03.15 |
---|---|
[Win32 API] 다중 모니터 좌표, 크기 구하기 (0) | 2013.07.27 |