본문 바로가기
C++ 200제/코딩 IT 정보

[윈도우API] WinCE DIB 섹션 프로그래밍 (tagRGBQUAD)

by vicddory 2017. 9. 22.

[윈도우API] WinCE DIB 섹션 프로그래밍 (tagRGBQUAD)


앞서 설명한 것(▶DIB 섹션 포스팅 1)처럼 이미지가 픽셀당 8비트 이하인 경우 BITMAPINFOHEADER 구조체 다음에는 RGBQUAD 구조체의 배열이 이어진다.


RGBQUAD 구조체는 다음과 같다.


1
2
3
4
5
6
typedef struct tagRGBQUAD { /* rgbq */
    BYTE rgbBlue;
    BYTE rgbGreen;
    BYTE rgbRed;
    BYTE rgbReserved;
} RGBQUAD;
cs


이 구조체는 256단계의 적, 녹, 청 색상을 표현한다.


물론 이 구조체의 색상들은 디스플레이 장치의 사양에 따라서 표현되지 않을 수도 있다.


RGBQUAD 구조체 배열은 DIB 팔레트를 기술한다. 팔레트란 비트맵에 사용된 색상 목록이다. 비트맵이 팔레트를 가지고 있으면 비트맵 픽셀 정보가 색상을 나타내는 것이 아니라 팔레트에 있는 색상 인덱스를 나타낸다.

단색 비트맵에선 팔레트가 필요 없지만 컬러 장치에선 매우 중요하다. 예를 들어 256 색상 비트맵은 각 픽셀이 1바이트를 사용하지만 그 바이트는 24비트 색상 중 하나를 가리킨다.


그래서 256 색상 비트맵은 256 색상만 표현할 수 있지만 각 색상은 24비트 팔레트에 있는 1,600만 색상 중에서 고를 수 있으므로 더 유연하게 색상을 사용할 수 있다.


윈도우API 닷넷난 닷넷이 좋다


실제 시스템은 거의 32비트 체계이므로 더 편리하도록 24비트 색상 정보는 32비트로 확장됐다. 구조체 이름이 RGBQUAD인 이유는 여기서 유래한다(QUAD = 4).


CreateDIBSection의 나머지 네 개 파라미터 중에서 윈도우 CE는 두 개만 사용한다. iUsage 파라미터는 색상이 팔레트에서 어떻게 표현되는지를 나타낸다.


이 파라미터가 DIB_RGB_COLORS이면 각 픽셀의 정보가 완전한 RGB 색상 정보로 표현된다는 뜻이다. DIB_PAL_COLORS이면 픽셀은 DC에 현재 선택된 팔레트의 인덱스 정보로 색상을 표현한다.


ppvBits 파라미터는 비트맵 이미지의 포인터를 받을 포인터 변수다.


윈도우API 윈도우 프로그래밍난 CE .net이 좋다


마지막 두 파라미터인 hSection, dwOffset는 윈도우 CE에서 지원되지 않으므로 0으로 설정해야 한다.


다른 윈도우 운영체제에서는 메모리 맵 파일로서 비트맵 데이터를 받을 수 있다.

윈도우 CE가 메모리 맵 파일을 지원하긴 하지만 CreateDIBSection에서는 사용할 수 없다.


DIB 팔레트를 다루는 함수는 다음과 같다.


1
2
3
4
5
6
UINT GetDIBColorTable(
    HDC hdc, UINT uStartIndex, Uint cEntries, RGBQUAD *pColors);
 
UINT SetDIBColorTable(
    HDC, hdc, UINT uStartIndex,
    UINT cEntries, RGBQUAD *pColors);
cs


두 함수에서 uStartIndex는 설정하거나 조회할 팔레트의 첫 번째 요소를 나타낸다.


cEntries 파라미터는 팔레트의 요소 개수를 나타낸다.

RGBQUAD 배열 포인터는 색상 배열이고, SetDIBColorTable은 설정을, GetDIBColorTable은 조회를 할 때 사용한다.


[윈도우API] WinCE DIB 섹션 프로그래밍 (tagRGBQUAD)

댓글