김성엽의 Windows 프로그래밍 이야기를 보고 정리한 글입니다.
비트맵에 대하여
해상도가 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라고 한다.
비트맵 생성하기
비트맵을 생성하는 방법은 두 가지가 있다.
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
.... 원래 비트맵을 개발자가 직접 그리는 것은 상당히 까다로운일이라고 설명 ....
그래서 개발자들을 위해 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)이다.
'Windows 프로그래밍' 카테고리의 다른 글
GDI 시스템의 이해 (0) | 2020.05.10 |
---|---|
Windows 프로그래밍 맛보기와 프로그램 구성 파악하기 (0) | 2020.05.09 |
자신만의 Window를 사용하려면 자신만의 'Window Class'를 만들자 (0) | 2020.05.07 |
기본적으로 알아야 할 용어와 개념에 대하여 (0) | 2020.05.07 |