380 likes | 572 Vues
Windows Programming 제대로 배우기. Chapter 12. Bitmap Handling. 학습 목표. 비트맵 파일 처리. BitBlt. 비트맵은 아이콘 , 그림 , 사진 등이 어떠한 형식을 가지고 저장된 리소스를 말하며 , 메뉴와는 달리 별도의 파일형태 (bmp) 로 저장 HBITMAP hBitmap; hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));. 비트맵 출력 절차
E N D
Windows Programming제대로 배우기 Chapter 12. Bitmap Handling
학습 목표 • 비트맵 파일 처리
BitBlt • 비트맵은 아이콘, 그림, 사진 등이 어떠한 형식을 가지고 저장된 리소스를 말하며, 메뉴와는 달리 별도의 파일형태(bmp)로 저장 HBITMAP hBitmap; hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
비트맵 출력 절차 • 현재의 화면 DC와 호환되는 새로운 DC를 하나 만든다(MemDC) • 이 MemDC에 비트맵을 Select한다 • BitBlt와 같은 함수로 DC간 고속복사를 수행하여 나타냄
1. 화면 DC와 호환되는 새로운 DC만듬 화면 DC Mem DC Bitmap Bitmap 2. Select 3. BitBlt HDC hMemDC; hMemDC = CreateCompatibleDC(hdc); SelectObject(hMemDC, hBitmap); BitBlt(hdc, 0, 0, 320, 320, hMemDC, 0, 0, SRCCOPY);
1. hMemDC = CreateCompatibleDC(hdc); 2. SelectObject(hMemDC, hBitmap); 3. BitBlt(hdc, 0, 0, 320, 320, hMemDC, 0, 0, SRCCOPY); • 주어진 DC와 호환되는 DC 생성, 이때 ‘호환된다’라는 뜻은 현재의 설정상태(예: 256칼라)와 동일한 속성을 갖는 DC를 생성함을 의미 • 새로 만든 DC에 그림을 선택함, Pen이나 Brush를 선택할 때 사용했던 함수, Bitmap도 GDI Object에 해당 (주의사항 : Pen과 같은 Object 설정할 때처럼 hdc에 선택하는 것이 아니라, 따로 생성된 hMemDC사용) • BitBlt 함수는 DC간 블록 전송을 수행하는 함수이며, 두 DC간에 작업이 이루어짐 • 비트맵 출력 시 사용 함수 • BitBlt • StretchBlt • PatBlt
BOOL BitBlt( HDC hDC, int X, int Y, int nWidth, int nHeignt, HDC hSrcDC, int XSrc, int ySrc, DWORD dwROP); ▶hDC:비트맵이 복사될 DC ▶X,Y,nWidth,nHeight:비트맵이 복사될 위치의 좌상단 좌표와 폭, 넓이, 이 값은 논리적 좌표값이다. ▶HSrcDC:복사될 비트맵을 가지고 있는 DC. 만약 dwROP가 소스가 필요없는 값이라면 NULL이 될 수도 있다. ▶XSrc,YSrc:복사될 비트맵의 좌측 상단 좌표이며 복사처와 마찬가지로 논리적 좌표값이다. 이 값이 0일 경우 전체 비트맵을 복사한다. 복사원의 폭과 높이는 복사처의 nWidth, nHeight가 적용된다. ▶dwROP:ROP코드, 즉 브러쉬와 복사원, 복사처의 비트맵 색상이 논리 연산될 방법을 지정한다. 모두 256개의 가능한 값이 있지만 실제로 의미를 갖는 없은 다음 15개이며 매크로 상수가 정의되어 있다. 이 외의 ROP코드가 필요할 경우에는 상수를 직접 사용해야 한다.
아래 표에서 S는 복사원 (Source), D는 복사처(Destination), P는 패턴(Pattern, 즉 브러쉬)를 의미한다.
SDK Temp.txt에서 소스 템플릿 복사 후 컴파일
그림 크기 알아내기 • int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject); ▶hgdiobj : 조사하고자 하는 GDI 오브젝트의 핸들. 비트맵, 브러시, 팬, 폰트 등의 핸들을 준다. ▶cbBuffer : 버퍼에 기록할 정보의 크기. sizeof(lpvObject)값을 주면 된다. ▶lpvObject : 오브젝트의 정보를 리턴받을 구조체의 포인터. 핸들의 타입에 따라 사용되는 구조체가 달라진다. 이 인수를 NULL로 주면 필요한 버퍼의 크기를 리턴해 준다.
GetObject(hBitmap, sizeof(BITMAP), &bmp); BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hMemDC, 0, 0, SRCCOPY);
StretchBlt • 그림을 크게 늘거나 줄이는데 사용 • BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop); ▶hDC:비트맵이 복사될 DC ▶X,Y,nWidth,nHeight:비트맵이 복사될 위치의 좌상단 좌표와 폭, 넓이, 이 값은 논리적 좌표값이다. ▶HSrcDC:복사될 비트맵을 가지고 있는 DC. 만약 dwROP가 소스가 필요없는 값이라면 NULL이 될 수도 있다. ▶nXOriginSrc,nYOriginSrc, nWidthSrc, nHeightSrc:복사될 비트맵의 좌측 상단 좌표와 크기. 이 영역의 크기와 복사처의 크기가 다를 경우 비트맵은 복사처의 크기에 맞게 축소되거나 확대된다. ▶dwROP:ROP코드, 즉 브러쉬와 복사원, 복사처의 비트맵 색상이 논리 연산될 방법을 지정한다. 모두 256개의 가능한 값이 있지만 실제로 의미를 갖는 없은 다음 15개이며 매크로 상수가 정의되어 있다. 이 외의 ROP코드가 필요할 경우에는 상수를 직접 사용해야 한다.
아래 표에서 S는 복사원 (Source), D는 복사처(Destination), P는 패턴(Pattern, 즉 브러쉬)을 의미한다.
(예) 이미지의 크기 토글하는프로그램 R1 m_SrcRect Destination (원본 크기) ? m_bLargeFlag R2 m_BoundRect (확대 크기)
Bitmap Animation • Drawing <-이전 그림 지운 후 • …… • Drawing <- 새로운 위치에 다시 그림
애니메이션을 위한 프레임 처리 32 32 32 32 32 1 2 3 4
이미지 합성을 위한 마스킹 기법 // 소스의 원하는 부분을 흑백으로 처리한 패턴을 배경 그림과 AND 연산으로 드로잉 => 배경이미지에 흑색 그림만 그려짐, 여기에 원하는 그림을 OR 연산으로 그리면 배경과 합성된 이미지 그림.
MemoryDC를 이용한 BackSurfacing 기법 • 속도 개선을 위한 방법 BackSurface 2. DC간 블록전송 0.미리 Select되어 있는 MemDC hdc MemDC 원하는 소스의 그림을 Select 후 3. DC간 블록전송
실습 • 새로운 배경파일 로드 • 새로운 캐릭터 파일 (마스크BMP,원본BMP) 생성 • 애니메이션 출력