삽질의 현장/- 윈도우 API

#014_WIndow_API_비트맵

shovelman 2015. 9. 17. 21:55


안녕하세요 삽잡이 입니다.

이번 시간에는 비트맵에 대해서 알아보려고 합니다.


비트맵은 MS에서 만든 이미지 포멧입니다.

대표적으로 이미지 포멧에는 JPG, PNG 등이 있습니다.

이는, 표준화 기구, 범용 기구, 회사에서 만들었다는 차이를 가지고 있습니다.

MS에서는 자신의 것들로 그리자고 만든 것이 바로 비트맵입니다.


화면에 그리기를 시도할 때에는 디바이스 컨텍스트 (DC)를 얻어야합니다.

DC를 얻어서 사용하기 위해서는 해당 DC의 핸들을 얻어서 사용하게 됩니다.

즉, DC는 화면에 그리기 위한 정보입니다.

그 중에서 우리가 사용했던 DC는 클라이언트 영역에 그리기 위한 DC였습니다.


우리가 보고 있는 화면은,

비디오 메모리 비트맵으로 보관되어 있고, 

해당 화면에 그림을 그리게 된다면 비트맵이 바뀌면서 화면이 그려지는 것입니다.

즉, 위치에 따른 value 값들이 바뀌고 화면에 뿌려지는 것입니다.


DC안에는 수많은 그리기 정보들이 있는데, 

그 중에서 그리기 영역에 관한 정보도 있습니다.

그리기 영역이 비트맵이라면, 우리는 비트맵을 그릴 수 있게 되겠지요.


비트맵을 출력 하기 위해서도 DC가 필요합니다.

화면에 그리기를 하려면, 화면에 대한 클라이언트 영역의 DC가 필요한데...

비트맵을 사용하기 위해서는 메모리 상에서만 생성하는 메모리 DC가 필요합니다.


두 DC의 차이는 하나는 화면을 그리기 위한 DC,

또 하나는 비트맵을 위한 DC라는 것입니다.

메모리 DC는 그리기라는 기능은 똑같지만, 

그리기 영역이 클라이언트 영역이 아니라는 차이를 가지고 있습니다.


과거 컴퓨터에서는 비트맵의 크기도 크고 속도도 느린 이유로

비트맵 하나를 뿌리기에도 쉽지가 않았습니다.

따라서 우리는 비트맵을 화면에 뿌리기 위해서는 

메모리 DC를 만들고 그 DC에다가 그리기 영역을 비트맵으로 선택해야 합니다.


메모리 DC에 비트맵을 장착하게 된다면, 해당 그리기 영역은 비트맵이 됩니다.

메모리 DC는 비트맵을 그린 영역이 되고,

DC는 화면에 대한 그리기 정보를 각각 가지고 있는데

메모리 DC를 DC에 전송하면 비트맵이 올라가게 되는 것입니다.

이 때 자주 사용하는 함수로는 비트맵 블록을 전송하는 BitBlt 함수와 

원본 그대로를 대칭, 사이즈를 늘리거나 줄여 뿌리고자 할때 사용하는 StrechBit 함수가 있습니다.


계속 해서 반복하지만, 비트맵을 뿌리기 위해서는 우선 메모리 DC를 생성해야합니다.

DC는 그리기 정보이고, 그리기 정보가 굉장히 많기에 우리는 DC 정보를 모두 꽉 채울 수는 없습니다.

따라서 호환 가능한 즉, 화면과 똑같은 정보를 갖는 메모리 DC를 만들어야 합니다.


DC를 생성하게 됬다면, 비트맵이 필요합니다.

비트맵이 리소스상의 ID에는 존재하지만, 프로그램 상에는 존재하지 않습니다.

메모리에 아직 뜨지 않았기때문이죠...


비트맵 메모리를 메모리상에 가져와서 DC에 장착하면 비트맵을 클라이언트 영역에 뿌릴 수 있게 됩니다.


글을 읽어보니 비트맵에 대해서 알아보지도 못할 글을 남겼군요...

하... 멘붕입니다... 허허...