더북(TheBook)

일반 C++ 클래스 마법사가 만들어주는 IppDib 클래스는 기본적인 생성자와 소멸자만 가지고 있다. 이제 여기에 IppDib 클래스에 필요한 기능들을 하나하나 추가해보자.

먼저 IppDib 클래스에 필요한 멤버 변수에 대해 생각해보자. IppDib 클래스는 DIB 구조를 통째로 메모리에 저장하여 가지고 있을 것이다. 그러므로 IppDib 클래스는 DIB 구조 전체 크기를 나타낼 정수형 변수 하나와 동적 할당된 메모리 공간을 가리킬 포인터형 변수 하나를 멤버로 가지고 있어야 한다. 비트맵 영상의 가로 크기, 세로 크기 등 비트맵 영상 자체에 대한 정보들은 DIB 구조 중 BITMAPINFOHEADER 구조체 정보를 참조하여 알 수 있다. 그러나 영상의 가로 크기, 세로 크기, 색상 수 등의 정보는 비트맵 영상을 다루면서 매우 빈번하게 사용하기 때문에 이에 대한 정보들도 멤버 변수로 추가해놓으면 편리하다. 그러므로 IppDib 클래스에는 아래와 같은 정보를 멤버 변수로 추가할 것이다.

private:
    LONG  m_nWidth;
    LONG  m_nHeight;
    WORD  m_nBitCount;
    DWORD m_nDibSize;
    BYTE* m_pDib;

m_nWidthm_nHeight 멤버 변수는 각각 영상의 가로와 세로 픽셀의 크기를 나타낸다. 자료형으로 LONG 타입을 사용한 이유는 BITMAPINFOHEADER에서 LONG 타입을 사용하기 때문인데 LONG 타입 대신에 int 타입을 사용해도 무방하다. m_nBitCount는 픽셀당 비트 수를 나타낸다. 그레이스케일 영상인 경우 m_nBitCount 변수의 값은 8이며, 트루컬러 영상인 경우는 24의 값을 갖는다. m_nDibSize는 DIB 구조를 저장하는 데 필요한 공간, 즉 [BITMAPINFOHEADER 구조체+색상 테이블+픽셀 데이터]가 차지하는 공간의 크기를 바이트 단위로 나타낸다. m_pDib는 DIB 구조를 저장하는 메모리 공간의 시작 주소를 가리킨다. m_pDib에서 가리키는 메모리 공간은 실제 프로그램 동작 시 new 연산자를 이용하여 동적 할당될 것이다. 동적 할당할 때의 메모리 공간 크기는 m_nDibSize를 참조하여 알 수 있다. 그림 4-7은 IppDib 클래스의 멤버 변수들의 의미를 도식적으로 보여준다.

그림 4-7 IppDib 클래스 멤버 변수들의 의미

그림 4-7을 보면 m_pDib가 DIB 구조의 시작 위치를 가리키고 있고, 이는 BITMAPINFO HEADER 구조체의 시작 위치와 같다. m_pDibBYTE* 타입으로 정의되어 있지만, 이를 BITMAPINFOHEADER* 타입으로 형변환하면 BITMAPINFOHEADER 구조체에 정의된 멤버들을 참조할 수 있다.

BITMAPINFOHEADER* lpbi = (BITMAPINFOHEADER*)m_pDib;

위와 같이 코드를 작성하면 m_nWidth, m_nHeight, m_nBitCount 등의 값은 lpbi->biWidth, lpbi->biHeight, lpbi->biBitCount 등의 형태로 알아낼 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.