Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

Code Habit

API ) StretchDIBits 이미지 출력하기 본문

카테고리 없음

API ) StretchDIBits 이미지 출력하기

코드베어 2020. 5. 12. 10:06

StretchDIBits 함수를 사용하여 이미지 파일을 화면상(윈도우)에 출력할 수 있다.

VOID CTestCtrl::OnPaint( HDC /*hDC*/ )
{
	CPaintDC dc( m_hWnd );		// 함수 종료시 지가 알아서 release 함
	CDC mDC;
	CBitmap mBitmap;
	CBitmap mBitmap_old;
	CRect rect;
	
	GetClientRect(&rect);

	mDC.CreateCompatibleDC(dc);
	mBitmap.CreateCompatibleBitmap(dc, rect.right, rect.bottom);
	mBitmap_old = mDC.SelectBitmap(mBitmap);
    
	int width = rect.Width();
	int height = rect.Height();
	if( NULL != m_pBuffer ) {
		mDC.FillSolidRect(rect, RGB(0, 0, 0));
		
        // BITMAPINFO 
		BITMAPINFO bInfo;
		bInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
		bInfo.bmiHeader.biPlanes = 1;
		bInfo.bmiHeader.biBitCount = 32;
		bInfo.bmiHeader.biCompression = BI_RGB;
		bInfo.bmiHeader.biWidth = m_nimgW;
		bInfo.bmiHeader.biHeight = -m_nimgH;
		bInfo.bmiHeader.biSizeImage = m_nimgW * m_nimgH * 4;
		SetStretchBltMode(mDC, COLORONCOLOR);  // set iMode.
		mDC.StretchDIBits(0, 0, rect.Width(), rect.Height(), 0, 0, m_nimgW, m_nimgH, m_pBuffer, &bInfo, DIB_RGB_COLORS, SRCCOPY); // m_pBuffer : 이미지 버퍼
	} else {
		mDC.FillSolidRect(rect, RGB(0, 0, 0));
	}

	dc.BitBlt(0, 0, rect.Width(), rect.Height(), mDC, 0, 0, SRCCOPY);

	mDC.SelectBitmap(mBitmap_old);
	mBitmap.DeleteObject();
	mDC.DeleteDC();

	return;
}

 

 

StretchDIBits 함수 원형

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

 

StretchDIBits 함수는 원본 그대로 출력하는 것이 아니라 크기를 늘이거나 줄일 수 있는데 이때 화면이 깨지게 된다. 이를 방지하기 위해 다음 함수를 사용할 수 있다.

int SetStretchBltMode(
    HDC        hdc,
    int        iStretchMode	// 늘이기 모드
);

iStretchMode : COLORONCOLOR로 지정해 주어야 깔끔한 영상 출력이 가능하다.