이미지를 다루다 보면 다양한 포맷들을 볼 수 있습니다. 실생활에서도 비트맵 Bitmap 이미지를 많이 사용하기도 하며 MFC와 C# 윈폼에서 화면에 그려주는 이미지가 비트맵이기도 합니다.
MFC (Microsoft Foundation Class) 라이브러리를 이용하여 비트맵을 만들어 화면에 출력하거나 파일로 저장하는 과정을 살펴 보겠습니다. 단계별로 보면, 메모리 DC 생성을 하고 비트맵 객체 생성, 그리기 작업을 수행합니다. 이후 비트맵 이미지를 저장하거나 화면에 출력하고 리소스 해제를 하면 끝입니다.
GDI (Graphics Device Interface) 그리기
memDC.FillSolidRect(0, 0, width, height, RGB(255, 255, 255)); // 배경 흰색
memDC.TextOutW(10, 10, _T("Hello Bitmap!!!")); // 텍스트 출력
화면에 출력 또는 저장
pDC->BitBlt(0, 0, width, height, &memDC, 0, 0, SRCCOPY); // 화면 출력
CImage image; // 저장
image.Attach((HBITMAP)bitmap.Detach()); // CBitmap → HBITMAP → CImage
image.Save(_T("output.bmp"));
리소스 해제
memDC.SelectObject(pOldBitmap); // 원래 비트맵으로 복원
bitmap.DeleteObject(); // 리소스 해제
memDC.DeleteDC(); // 리소스 해제
OnDraw 함수를 이용한 전체 코드는 아래와 같습니다. 이미지를 화면에 출력시 Device Context(pDC)의 BitBlt 함수를 이용하는 것을 볼 수 있습니다. 함수 별 활용법을 알아두면 실무 개발에 많은 도움이 될 수 있습니다.
void CMyView::OnDraw(CDC* pDC)
{
int width = 100;
int height = 100;
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC, width, height);
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
// 배경 및 텍스트 출력
memDC.FillSolidRect(0, 0, width, height, RGB(200, 220, 255));
memDC.TextOutW(10, 10, _T("Hello Bitmap!!!"));
// 화면에 출력
pDC->BitBlt(0, 0, width, height, &memDC, 0, 0, SRCCOPY);
// 리소스 정리
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
}
추가로 비트맵 헤더 정보는 아래와 같고 실제 프로그래밍 시 각 요소에 접근이 필요할 때가 있습니다. 압축 설정에는 여러 종류가 있으며 일반적으로 무압축 BI_RGB를 설정 합니다.
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
'프로그래밍 기술' 카테고리의 다른 글
[MFC] 윈도우 GUI 프로그래밍: DC, CDC, HWND 알고 활용하기 (0) | 2025.06.22 |
---|---|
[C++/MFC] 윈도우 API 유용한 함수 ShellExecute 기본과 활용 (0) | 2025.06.18 |
오래된 PC 하드 HDD에서 SSD로 교체, 윈도우 OEM 제품키 확인하기 (2) (0) | 2025.05.12 |
오래된 PC 하드 HDD에서 SSD로 교체, 윈도우 OEM 제품키 확인하기 (1) (0) | 2025.05.09 |
[C#] Winform 환경에서 메인 Main에서 서브 Sub 폼으로 이미지 전달하기 (0) | 2025.05.04 |