더북(TheBook)

3.2.2 비트맵 파일 헤더

BMP 파일의 맨 처음에는 비트맵 파일에 대한 정보를 담고 있는 비트맵 파일 헤더가 나타난다. 비트맵 파일 헤더는 BITMAPFILEHEADER 구조체로 표현할 수 있으며, 이 구조체는 다음과 같이 정의되어 있다.

typedef struct tagBITMAPFILEHEADER {
    WORD       bfType;
    DWORD      bfSize;
    WORD       bfReserved1;
    WORD       bfReserved2;
    DWORD      bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

BITMAPFILEHEADER 구조체의 각 멤버member에 대한 설명은 아래 표 3-1에 정리하였다.

표 3-1 BITMAPFILEHEADER 각 멤버의 의미

멤버 이름

설명

bfType

비트맵 파일임을 나타내기 위한 지시자로써 항상 ‘BM’이라는 값을 저장한다. 영문자 ‘B’와 ‘M’은 16진수로 각각 0x42, 0x4D로 표현된다. 그러므로 BMP 파일을 바이너리 편집기로 열어서 16진수 형태로 보면 항상 처음이 0x42 0x4D로 시작하는 것을 확인할 수 있다.

bfSize

해당 BMP 파일의 크기를 바이트 단위로 나타낸다.

bfReserved1

bfReserved2

추후 사용하기 위해 예약된 값이다. 현재는 사용하지 않는 멤버이며, 항상 0의 값을 갖는다.

bfOffBits

BITMAPFILEHEADER 구조체의 시작 위치부터 실제 픽셀 데이터 정보를 담고 있는 비트맵 비트까지의 바이트 오프셋을 나타낸다. 즉, [BITMAPFILEHEADER 크기 + BITMAPINFOHEADER 크기 + 색상 테이블 크기]와 같다.

BITMAPFILEHEADER 구조체 정의에서 사용된 데이터 타입 중 WORD는 2바이트 크기를 가지며, DWORD는 4바이트의 크기를 갖는다. 그러므로 BITMAPFILEHEADER 구조체의 전체 크기는 14바이트이다. BMP 파일을 분석함에 있어서, 각 구조체의 크기를 정확하게 이해하고 있는 것은 매우 중요하다. 추후 실제 BMP 파일을 처리하는 프로그램을 작성할 때, BMP 파일의 시작 위치에서부터 14바이트를 읽어서 BITMAPFILEHEADER 구조체로 간주하여 사용하게 될 것이다.

Note | WORD, DWORD, LONG 자료형

BITMPAFILEHEADER 및 BITMAPINFOHEADER 구조체 멤버들은 일반적인 C/C++에서 사용하지 않는 WORD, DWORD, LONG 같은 새로운 자료형을 사용하고 있다. 이 자료형들은 Windows 운영체제에서 사용하기 위해 따로 정의된 타입들이다. 실제로 WORD, DWORD, LONG 자료형은 아래와 같이 정의되어 있다.

typedef    unsigned short    WORD;
typedef    unsigned long     DWORD;
typedef    long              LONG;

Windows 운영체제 환경에서는 short과 long 타입이 각각 2바이트와 4바이트 크기를 갖는다. 그러므로 WORD는 2바이트로 표현되고, DWORD와 LONG은 4바이트의 크기를 갖는다. 참고로 64비트 Windows 운영체제에서도 short과 long 자료형의 바이트 크기는 동일하다. 다만 64비트 Unix, Linux 등의 운영체제에서는 long 타입이 8바이트로 표현되기 때문에 코딩 시 주의해야 한다.

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