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

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

by vicddory 2017. 9. 21.

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


윈도우API CE에서 비트맵 파일을 읽는 작업은 쉽다. 파일을 읽어서 비트맵 정보를 얻어내는 작업 외에도 화면에 있는 비트맵을 읽어서 조작하고, 조작한 비트맵을 화면에 다시 그리는 작업이 필요할 때도 있다.


이런 작업도 DDB보다 윈도우API DIB가 쉽게 처리할 수 있다. DDB에서도 장치 의존적인 비트를 얻어낼 수 있지만 버퍼의 포맷이 장치 의존적이므로 복잡하다.


DIB를 사용하면 DIB 섹션을 사용해서 디스플레이 장치의 포맷에 상관없이 이미 정의되어 있는 포맷의 비트맵으로 읽을 수 있으므로 편리하게 프로그램을 작성할 수 있다.


윈도우 운영체제의 발전과 함께 다양한 윈도우API DIB 생성 함수를 지원하게 됐지만 윈도우 CE는 가장 유용한 다음 함수 한 개만 지원한다.


1
2
3
4
HBITMAP CreateDIBSection
        (HDC hdc, const BITMAPINFO *pbmi,
        UINT iUsage, void *ppvBits,
        HANDLE hSection, DWORD dwOffset);
cs


DIB 섹션은 윈도우 NT에서 비트맵 조작 성능을 개선하기 위해서 도입했다.

DIB 섹션은 디바이스 컨텍스트에 DIB를 선택해 넣고 비트를 직접 조작할 수 있게 비트맵과 연동시킨다. 이런 작업을 수행하기 위해서 DIB 섹션은 메모리 DC와 DC의 비트가 들어있는 버퍼를 결합한다.


이미지가 DC에 맵핑되어 있으므로 그래픽 함수로 이지를 조작할 수 있다. 동시에 DIB 포맷으로 된 DC의 원본 비트를 직접 조작하는 것도 가능하다. 윈도우 NT에선 성능 향상이 주안점이었지만 윈도우 CE에선 이미지를 쉽게 조작할 수 있다는 점이 중요하다.


이 함수의 파라미터 중에는 IBTMAPINFO 구조체 포인터가 중요하다.


이 윈도우API 구조체는 DIB 비트맵의 색상 구성과 비트맵의 형태를 기술하는 것으로 BITMAPINFOHEADER 구조체와 필요한 경우 색상 팔레트를 나타내는 RGBQUAD 값의 배열로 구성된다.


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


BITMAPINFOHEADER 구조체는 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct tagBITMAPINFOHEADER {
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
 
    WORD biPlanes;
    WORD biBitCount;
 
    DWORD biCompression;
    DWORD biSizeImage;
 
    LONG biXPelsPerMeter;
    LONG biYpelsPerMeter;
 
    DWORD biClrUsed;
    DWORD biClrImportant;
} BITMAPINFOHEADER; 
cs


구조체 정의에서 볼 수 있듯이 이 구조체는 CreateBitmap에서 사용한 파라미터보다 훨씬 더 많은 정보를 담고 있다.


1. DWORD biSize

첫 번재 필드는 구조체의 크기이며 함수에 전달하기 전에 설정해야 한다. 이 구조체에서 약간 변경된 것이다.

biWidth, biHeight, biPlanes, biBitCount 필드는 CreateBitmap와 같은 이름을 사용하지만 biHeight의 부호가 음수이면 CreateBitmap과 같이 비트 배열이 위에서 아래로 포맷팅되고, 양수이면 아래에서 위로 포맷팅된다는 점이 다르다.


따라서 부호가 양수인 경우에는 첫 번째 비트가 맨 아래 줄을 나타내게 된다. CreateBitmap 함수와 마찬가지로 biPlanes는 1로 설정한다.


2. DWORD biCompression

biCompression 필드는 비트 배열에 사용한 압축 방법을 나타낸다.

윈도우 CE에서는 압축하지 않았음을 나타내는 BI_RGB 플래그와 픽셀 포맷이 색상 테이블에서 처음 요소 세 개에 의해서 지정됨을 나타내는 BI_BITFIELDS 플래그만 허용한다.


3. DWORD biSizeImage

biSizeImage 파라미터는 BI_RGB 플래그를 사용했을 때 비트 배열의 크기를 나타낸다. 그러나 biSizeImage 필드를 0으로 설정하면 BITMAPINFOHEADER 구조체에 있는 픽셀당 비트 수 정보로 배열 크기를 계산한다.


4. LONG biXPelsPerMeter, LONG biYpelsPerMeter

biXPelsPerMeter, biYpelsPerMeter 필드는 이미지의 크기를 지정할 때 사용하는 필드다. 그러나 CrateDIBSection에서 이 두 파라미터는 0으로 설정해야 한다.


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


5. DWORD biClrUsed

biClrUsed 파라미터는 색상 팔레트에서 실제로 사용하는 색상 수를 나타낸다. 256 색상의 이미지에서 팔레트는 256가지 색상이 존재하지만 비트맵 자체에는 100가지 색상만 사용한 경우도 있을 것이다.


이런 경우 팔레트 관리자가 시스템 팔레트 색상과 비트맵이 필요로 하는 색상을 효과적으로 대응시키기 위해서 biClrUsed 파라미터의 정보를 사용한다.


6. DWORD biClrImportant

biClrImportant 필드는 필요한 색상 수가 몇 개인지 알려주기 위해 사용된다.


그러나 대부분 비트맵에서 이 두 필드는 0으로 설정해 비트맵이 가진 모든 색상을 사용하고 모든 색상을 표현하는 것으로 지정한다.


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

댓글