더북(TheBook)

다음으로 비트맵을 확대 또는 축소하여 출력할 수 있는 StretchDIBits 함수에 대하여 알아보자. StretchDIBits 함수의 원형은 다음과 같다.

int StretchDIBits(
    HDC hdc,                      // 출력 대상의 DC 핸들
    int XDest,                    // 출력 대상의 좌상귀 x 좌표
    int YDest,                    // 출력 대상의 좌상귀 y 좌표
    int nDestWidth,               // 출력 대상의 사각형 너비
    int nDestHeight,              // 출력 대상의 사각형 높이
    int XSrc,                     // DIB 원본의 좌상귀 x 좌표
    int YSrc,                     // DIB 원본의 좌상귀 y 좌표
    int nSrcWidth,                // DIB 원본 사각형 너비
    int nSrcHeight,               // DIB 원본 사각형 높이
    CONST VOID *lpBits,           // 픽셀 데이터 시작 주소
    CONST BITMAPINFO *lpBitsInfo, // BITMAPINFO 구조체 시작 주소
    UINT iUsage,                  // RGB 또는 색상 테이블 인덱스
    DWORD dwRop                   // 래스터 연산 코드
);

StretchDIBits 함수는 앞서 살펴본 SetDIBitsToDevice 함수와 상당히 유사한 인자를 가지고 있으나, 몇 가지 추가되고 없어진 것도 있다. 우선 StretchDIBits 함수가 원본 비트맵을 확대 또는 축소하여 출력할 수 있기 때문에 nDestWidthnDestHeight가 함수의 인자로 추가되었다. 즉, StretchDIBits 함수는 원본 DIB의 (XSrc, YSrc) 좌표로부터 가로 nSrcWidth, 세로 nSrcHeight 크기만큼의 사각형 영역을 출력 대상의 좌표 (XDest, YDest)에서 시작하여 가로 nDestWidth, 세로 nDestHeight 크기로 출력한다. 이때 nDestWidth, nDestHeightnSrcWidth, nSrcHeight보다 크면 원본보다 확대해서 출력하는 것이고, 작으면 축소한 형태로 출력하는 것이다. lpBits, lpBitsnfo, iUsage 인자는 이름이 약간 바뀌었지만 SetDIBitsToDevice 함수의 lpvBits, lpbmi, fuColorUse와 동일한 의미를 갖는 인자들이다. dwRop는 래스터 연산 방법을 지정할 수 있는데, 일반적인 화면 출력이라면 SRCCOPY를 지정하면 된다.

Note | SetPixel 함수

Windows API는 윈도우 특정 좌표에 특정 색상의 점을 그리는 SetPixel이라는 함수를 제공한다. 이 함수의 원형은 아래와 같다.

COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);

변수 인자에서 짐작할 수 있듯이 hdc는 출력 윈도우의 DC 핸들이고, X와 Y는 출력할 좌표이다. 색상 정보는 COLORREF 타입으로, COLORREF 타입은 RGB 매크로를 이용하여 쉽게 지정할 수 있다. 이 함수를 이용하여 특정 윈도우의 640×480 영역을 빨간색으로 그리려면 아래와 같은 형태로 코드를 작성하면 된다.

for (j = 0; j < 480; j++)
    for (i = 0; i < 640; i++)
        SetPixel(hdc, i, j, RGB(255, 0, 0));

코드만 보면 매우 직관적이고 사용하기 쉬워 보인다. 그러나 위 코드는 말 그대로 SetPixel 함수를 이용하여 점을 하나하나 찍어 그리는 방식이기 때문에 너무 느리게 동작한다. 실제로 이 코드를 실행해보면 빨간줄이 한 줄씩 그려지고 있는 것이 보일 정도이다. 그렇기 때문에 영상을 출력할 때 SetPixel 함수는 실제적으로 사용하기 어렵고, DIB 화면 출력 함수를 사용하는 것이 바람직하다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.