Windows 프로그래밍

Windows 운영체제는 화면에 그림을 어떻게 출력하는가?

최문경 블로그 2020. 5. 9. 11:17
 

김성엽의 Windows 프로그래밍 이야기

기본적으로 Windows 프로그래밍을 배운다는 뜻은 Win32 API를 사용한 응용 프로그램을 만드는 방법에 ...

blog.naver.com

김성엽의 Windows 프로그래밍 이야기를 보고 정리한 글입니다.

 

 

 

비트맵에 대하여

 

비트맵에 대하여

: Win32 프로그래밍 관련 전체 목차http://blog.naver.com/tipsware/221059977193 1. 컴퓨터의 화면 출력 ...

blog.naver.com

 

 

해상도가 1920 x 1080이라고 되어 있는 것은 가로 방향으로 1920개의 점이 출력될 수 있고 세로 방향으로는 1080개의 점이 출력될 수 있다는 뜻이다. 즉, 화면 전체가 1920x1080 = 2,073,600개의 점으로 구성되어 있다는 뜻이다.

 

그리고 각 점은 비트로 구성되어있는 데, 화면을 표시할 때 그 비트값에 따라 화면이 달라지므로 비트(bit)의 지도(map)와 같다고 해서 비트맵(bitmap)이라고 한다.

 

또, 비트맵에는 장치에 종속적인 형태인 DDB(Device Dependent Bitmap)와 장치에 종속되지 않는 DIB(Device Independent Bitmap)의 두 가지 종류가 있다.

 

말 그래도 DDB는 특정 장치에서만 제대로 작동하는 비트맵이고 DIB는 비트맵 헤더를 가지고 있어서 장치가 달라지더라도 비트맵 헤더를 가지고 해당 장치에 맞도록 변환이 가능하기 때문에 어떤 장치에서도 제대로 작동한다.

 

최근에는 메모리 기술의 발달로 대부분 24비트 색상 또는 32비트 색상을 사용한다.

24비트 색상과 32비트 색상이 표현할 수 있는 색상의 수는 동일하다. 하지만 32비트는 색상의 투명도도 표현할 수 있다.

24비트 -> RGB(8비트, 8비트, 8비트)

32비트 -> RGBA(8비트, 8비트, 8비트, 8비트) 여기서 A는 Alpha라고 한다.

 

 

 

비트맵 생성하기

 

비트맵 생성하기

: Win32 프로그래밍 관련 전체 목차 http://blog.naver.com/tipsware/2210599771931. 먼저 봐야 할 내용들...

blog.naver.com

 

비트맵을 생성하는 방법은 두 가지가 있다.

1. CreateBitmap

함수의 원형

HBITMAP CreateBitmap(int nWidth, int nHeight, UNIT nPlanes, UNIT nBitCount, CONSTvoid *lpBits);

 

2. CreateCompatibleBitmap

함수의 원형

HBITMAP CreateCompatibleBitmap(HDC hdc, int nWidth, int nHeight);

 

둘의 차이점

CreateBitmap은 DDB 형식의 비트맵을 생성(4번째인자때문에)하기 때문에, 현재 장치가 어떤 색상 수를 사용하는지 얻어서 사용해야한다. 하지만 CreateCompatibleBitmap은 폭과 높이만 명시하면 되기 때문에 DIB 형식의 비트맵을 생성한다고 할 수 있다.

 

따라서 CreateCompatibleBitmap 함수가 CreateBitmap보다 더 많이 사용된다.

// 예시 코드
// HBITMAP h_my_bmp = CreateCompatibleBitmap(NULL, 16, 8); 도 가능
HBITMAP h_my_bmp = CreateCompatibleBitmap(h_dc, 16, 8);
// ... h_my_bmp를 사용해서 비트맵 사용...
DeleteObject(h_my_bmp); // h_my_bmp 비트맵 제거

 

 

 

Bitmap과 GDI 그리고 DC

 

Bitmap과 GDI 그리고 DC (Feat. GDI Object)

한동안 제가 비트맵에 대한 블로깅을 참 많이 했는데, 그 이유가 바로 GDI와 DC를 설명하려고 했던 것...

blog.naver.com

.... 원래 비트맵을 개발자가 직접 그리는 것은 상당히 까다로운일이라고 설명 .... 

 

그래서 개발자들을 위해 Windows 운영체제가 그래픽 장치에 대해 프로그램이 독립성을 유지할 수 있도록 만든 기술이 GDI(Graphics Device Interface)라고 한다.

 

그리고 Windows 운영체제는 그래픽 장치를 추상화 시키기 위해서 그리기에 필요한 요소들을 여러 개의 객체로 구성하고 장치에 종속적인 내용(그래픽 장치가 변경되면 수정되어야 할 사항)들을 해당 객체에 숨겼는데 그 객체들이 GDI Object이다.

 

대표적인 GDI Object

1. Bitmap

2. Pen

3. Brush

 

GDI 기술은 윈도우에 그림을 그릴 때 그래픽 장치에 종속적인 내용을 GDI Object에 숨겼기 때문에 현재 그림을 그리는 데 사용 중인 GDI Object들을 관리(저장) 하는 객체가 필요하다. 즉, 현재 그리기에 사용되는 GDI Object의 핸들 값을 저장하고 있는 객체가 필요하다는 뜻인데 이 객체가 DC(Device Context)이다.