비트맵이란 이미지를 저장하는 것으로 픽셀의 색상, 이미지 크기, 해상도등의 정보를 2차원 배열로 저장하는 있는 이미지 데이터이다.
비트맵의 종류
비트맵은 2가지 종류로 장치 종속적인 비트맵(DDB : Device Dependent Bitmap)과 장치 독립적 비트맵(DIB : Deviec Independent Bitmap)이 있다.
DDB의 구조
typedef struct tagBITMAP( LONG bmType; // 비트맵 타입 LONG bmWidth; // 가로 크기 LONG bmHeight; // 세로 크기 LONG bmWidthBytes; // 비트맵 이미지 한줄에 표현될 바이트 수 WORD bmPlanes; // 색상면의 개수 WORD bmBitsPixel; // 한 픽셀에 필요한 비트수 LPVOID bmBits; // 실제 비트맵 데이터를 가르키는 포인터 )BITMAP; |
DDB의 생성하는 함수
CreateBitmap()함수
CreateBitmap()함수는 흑백 비트맵을 만들 때 주로 사용한다.
HBITMAP CreateBitmap( int nWidth, // 이미지 폭 int nHeight, // 이미지 높이 UINT cPlanes, // 장치에 있는 색상면의 수이며 반드시 1이여야 한다. UINT cBitsPerPel, // 픽세의 색상을 결정하기 위한 필료한 비트 수 const VOID *lpvBits // 비트맵의 래스터 데이터로 반드시 워드(2바이트)배열로 이루어져야 한다. ); |
CreateCompatibleBitmap()함수
CreateCompatibleBitmap()함수는 컬러 비트맵을 만들 때 주로 사용한다.
HBITMAP CreateCompatibleBitmap( HDC hdc, // dc의 핸들을 지정 int nWidth, // 비트맵의 폭 int nHeight // 비트맵의 높이 ); |
비트맵 출력하기
BitBlt()함수
BOOL BitBlt( HDC hdcDest, // 비트맵이 복사될 대상 DC int nXDest, // 비트맵이 복사될 대상의 상단 X좌표 int nYDest, // 비트맵이 복사될 대상의 상단 Y좌표 int nWidth, // 복사될 비트맵의 폭 int nHeight, // 복사될 비트맵의 높이 HDC hdcSrc, // 복사될 비트맵을 가지고 있는 DC int nXSrc, // 복사될 비트맵의 상단 X좌표 int nYSrc, // 복사될 비트맵의 상단 Y좌표 DWORD dwRop // ROP코드, 복사원 및 복사처의 비트맵 색상이 논리연산될 방법을 지정 ); |
비트맵 확대, 축소하기
StretchBlt()함수
BOOL StretchBlt( HDC hdcDest, // 비트맵이 복사될 대상 DC int nXOriginDest, // 비트맵이 복사될 대상의 좌측 X좌표 int nYOriginDest, //비트맵이 복사될 대상의 좌측 Y좌표 int nHeightDest, // 비트맵이 복사될 높이 HDC hdcSrc, //복사될 비트맵을 가지고 있는 DC int nXOriginSrc, // 복사될 비트맵의 좌측 X좌표 int nYOriginSrc, // 복사될 비트맵의 좌측 Y좌표 int nWidthSrc, // 복사될 비트맵의 폭 int nHeightSrc, // 복사될 비트맵의 높이 |
LoadBitmap()함수
LoadBitmap()함수를 이용하여 리소스에 등록된 이미지 불러오기
HBITMAP LoadBitmap( HINSTANCE hInstance, // 비트맵 리소스를 가진 인스턴스 핸들 LPCTSTR lpBitmapName // 비트맵 리소스 ID를 지정하는 문자열 포인터. 정수형으로 정의된 비트맵을 읽을 때는 // MAKEINTRESOURCE 매크로를 사용 ); |
비트맵 출력하기
위와 같이 집그리기
#include <windows.h> #include <TCHAR.H> #include "resource.h" LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); HINSTANCE hInst; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASS WndClass; hInst = hInstance WndClass.style = CS_HREDRAW | CS_VREDRAW WndClass.lpfnWndProc = WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = hInstance WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); WndClass.lpszMenuName = NULL WndClass.lpszClassName = _T("Window Class Name"); RegisterClass(&WndClass); hwnd = CreateWindow(_T("Window Class Name"), _T("Window Title Name"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc, memdc; PAINTSTRUCT ps; static HBITMAP hBitmap;
switch (iMsg) { case WM_CREATE: hBitmap = (HBITMAP)LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1)); break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); memdc = CreateCompatibleDC(hdc); SelectObject(memdc, hBitmap); BitBlt(hdc, 0, 0, 332, 240, memdc, 0, 0, SRCCOPY); DeleteDC(memdc); EndPaint(hwnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd, iMsg, wParam, lParam); } |
실행 결과
이미지 크기 조정
가져오기 버튼을 선택하여 이미지를 불러온다.
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { // ... 중간생략...
switch (iMsg) { case WM_CREATE: hBitmap = (HBITMAP)LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2)); break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); memdc = CreateCompatibleDC(hdc); SelectObject(memdc, hBitmap); StretchBlt(hdc, 0, 0, 1060, 530, memdc, 0, 0, 530, 530, SRCCOPY); DeleteDC(memdc); EndPaint(hwnd, &ps); break; // ... 중간생략... } return DefWindowProc(hwnd, iMsg, wParam, lParam); } |
실행 결과]
'프로그램언어 > C++' 카테고리의 다른 글
ROP모드로 이미지 마스크 설정 (0) | 2020.12.22 |
---|---|
API 비트맵2 (0) | 2020.09.28 |
API 단축키 (0) | 2020.09.28 |
공용 대화상자 사용하기2 (0) | 2020.09.25 |
API 공용 대화상자 사용1 (0) | 2020.09.25 |