38
Windows Programming 제제제 제제제 Chapter 12. Bitmap Handling

Windows Programming 제대로 배우기

Embed Size (px)

DESCRIPTION

Windows Programming 제대로 배우기. Chapter 12. Bitmap Handling. 학습 목표. 비트맵 파일 처리. BitBlt. 비트맵은 아이콘 , 그림 , 사진 등이 어떠한 형식을 가지고 저장된 리소스를 말하며 , 메뉴와는 달리 별도의 파일형태 (bmp) 로 저장 HBITMAP hBitmap; hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));. 비트맵 출력 절차 - PowerPoint PPT Presentation

Citation preview

Page 1: Windows Programming 제대로 배우기

Windows Programming제대로 배우기

Chapter 12. Bitmap Handling

Page 2: Windows Programming 제대로 배우기

2

학습 목표

1. 비트맵 파일 처리

Page 3: Windows Programming 제대로 배우기

3

BitBlt

• 비트맵은 아이콘 , 그림 , 사진 등이 어떠한 형식을 가지고 저장된 리소스를 말하며 , 메뉴와는 달리 별도의 파일형태 (bmp) 로 저장

HBITMAP hBitmap;hBitmap = LoadBitmap(hInst,

MAKEINTRESOURCE(IDB_BITMAP1));

Page 4: Windows Programming 제대로 배우기

4

• 비트맵 출력 절차– 현재의 화면 DC 와 호환되는 새로운 DC 를

하나 만든다 (MemDC)– 이 MemDC 에 비트맵을 Select 한다– BitBlt 와 같은 함수로 DC 간 고속복사를

수행하여 나타냄

Page 5: Windows Programming 제대로 배우기

5

화면 DC Mem DC

1. 화면 DC 와 호환되는 새로운 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);

Page 6: Windows Programming 제대로 배우기

6

1. hMemDC = CreateCompatibleDC(hdc);2. SelectObject(hMemDC, hBitmap);3. BitBlt(hdc, 0, 0, 320, 320, hMemDC, 0, 0, SRCCOPY);

1. 주어진 DC 와 호환되는 DC 생성 , 이때 ‘호환된다’라는 뜻은 현재의 설정상태 ( 예 : 256 칼라 ) 와 동일한 속성을 갖는 DC 를 생성함을 의미

2. 새로 만든 DC 에 그림을 선택함 , Pen 이나 Brush 를 선택할 때 사용했던 함수 , Bitmap 도 GDI Object 에 해당 ( 주의사항 : Pen 과 같은 Object 설정할 때처럼 hdc 에 선택하는 것이 아니라 , 따로 생성된 hMemDC 사용 )

3. BitBlt 함수는 DC 간 블록 전송을 수행하는 함수이며 , 두 DC 간에 작업이 이루어짐

• 비트맵 출력 시 사용 함수– BitBlt– StretchBlt– PatBlt

Page 7: Windows Programming 제대로 배우기

7

• 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 코드가 필요할 경우에는 상수를 직접 사용해야 한다 .

Page 8: Windows Programming 제대로 배우기

8

• 아래 표에서 S 는 복사원 (Source), D 는 복사처 (Destination), P

는 패턴 (Pattern, 즉 브러쉬 ) 를 의미한다 .

Page 9: Windows Programming 제대로 배우기

9

Page 10: Windows Programming 제대로 배우기

10

Page 11: Windows Programming 제대로 배우기

11

SDK Temp.txt 에서 소스 템플릿 복사 후 컴파일

Page 12: Windows Programming 제대로 배우기

12

Page 13: Windows Programming 제대로 배우기

13

Page 14: Windows Programming 제대로 배우기

14

Page 15: Windows Programming 제대로 배우기

15

Page 16: Windows Programming 제대로 배우기

16

Page 17: Windows Programming 제대로 배우기

17

Page 18: Windows Programming 제대로 배우기

18

// 리소스 에디터에서 지정한 이름

Page 19: Windows Programming 제대로 배우기

19

// Global Handle 받아오기

Page 20: Windows Programming 제대로 배우기

20

결과화면

Page 21: Windows Programming 제대로 배우기

21

그림 크기 알아내기• int GetObject(HGDIOBJ hgdiobj, int cbBuffer, L

PVOID lpvObject);

▶hgdiobj : 조사하고자 하는 GDI 오브젝트의 핸들 . 비트맵 , 브러시 , 팬 , 폰트 등의 핸들을 준다 .

▶cbBuffer : 버퍼에 기록할 정보의 크기 . sizeof(lpvObject) 값을 주면 된다 .

▶lpvObject : 오브젝트의 정보를 리턴받을 구조체의 포인터 . 핸들의 타입에 따라 사용되는 구조체가 달라진다 . 이 인수를 NULL 로 주면 필요한 버퍼의 크기를 리턴해 준다 .

Page 22: Windows Programming 제대로 배우기

22

GetObject(hBitmap, sizeof(BITMAP), &bmp);BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hMemDC, 0, 0, SRCCOPY);

Page 23: Windows Programming 제대로 배우기

23

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 코드가 필요할 경우에는 상수를 직접 사용해야 한다 .

Page 24: Windows Programming 제대로 배우기

24

• 아래 표에서 S 는 복사원 (Source), D 는 복사처 (Destination), P 는 패턴 (P

attern, 즉 브러쉬 ) 을 의미한다 .

Page 25: Windows Programming 제대로 배우기

25

// 화면 꽉 채우게 출력

Page 26: Windows Programming 제대로 배우기

26

( 예 ) 이미지의 크기 토글하는프로그램

?

R1

R2

Destination

m_bLargeFlag

m_SrcRect

m_BoundRect

( 원본 크기 )

( 확대 크기 )

Page 27: Windows Programming 제대로 배우기

27

Page 28: Windows Programming 제대로 배우기

28

Page 29: Windows Programming 제대로 배우기

29

Page 30: Windows Programming 제대로 배우기

30

( 예 ) 특정영역의 확대

Page 31: Windows Programming 제대로 배우기

31

// 원래 크기로 돌아감

Page 32: Windows Programming 제대로 배우기

32

Bitmap Animation

• Drawing <- 이전 그림 지운 후

• ……

• Drawing <- 새로운 위치에 다시 그림

Page 33: Windows Programming 제대로 배우기

33

애니메이션을 위한 프레임 처리

1 2 3 4

32 32 32 32

32

Page 34: Windows Programming 제대로 배우기

34

Page 35: Windows Programming 제대로 배우기

35

이미지 합성을 위한 마스킹 기법

// 소스의 원하는 부분을 흑백으로 처리한 패턴을 배경 그림과 AND 연산으로 드로잉 => 배경이미지에 흑색 그림만 그려짐 , 여기에 원하는 그림을 OR 연산으로 그리면 배경과 합성된 이미지 그림 .

Page 36: Windows Programming 제대로 배우기

36

MemoryDC 를 이용한 BackSurfacing 기법

• 속도 개선을 위한 방법

BackSurface

MemDC

hdc

2. DC 간 블록전송

3. DC 간 블록전송 원하는 소스의 그림을 Select 후

0. 미리 Select 되어 있는 MemDC

Page 37: Windows Programming 제대로 배우기

37

Page 38: Windows Programming 제대로 배우기

38

실습

• 새로운 배경파일 로드• 새로운 캐릭터 파일 ( 마스크 BMP, 원본

BMP) 생성• 애니메이션 출력