BMP 파일 구조 중 색상 테이블 부분은 비트맵 파일의 속성에 따라 존재하지 않을 수도 있다. 그래서 그림 3-1에서는 색상 테이블 부분의 영역을 점선으로 표시했다. BMP 파일의 영상이 가지고 있는 색상이 256 색상 이하이면, 즉 색상 수가 2, 16, 256개인 경우에는 색상 테이블이 존재한다. 이와 달리 224=16,777,216가지의 색상을 표현할 수 있는 트루컬러 영상에는 색상 테이블 정보가 존재하지 않아서 BITMAPINFOHEADER 바로 뒤에 픽셀 데이터 정보가 나타난다.
이 책에서는 그레이스케일 영상과 트루컬러 영상에 대한 BMP 파일만 주로 다룰 것이다. 그레이스케일 영상이 아닌 256색 이하의 BMP 파일은 화면에 출력은 가능하지만 이후 영상 처리 알고리즘 구현 시에는 사용할 수 없다.
그레이스케일 영상의 BMP 파일에는 256단계의 무채색을 표현하는 RGBQUAD 배열이 저장되어 있다. RGBQUAD 구조체 하나의 크기가 4바이트이므로 그레이스케일 비트맵의 색상 테이블 영역의 크기는 256*4=1024바이트이다. 그리고 픽셀 데이터 부분에는 각 픽셀의 그레이스케일을 표현하는 RGBQUAD 배열의 인덱스가 저장되어 있다. 트루컬러 영상을 표현하는 BMP 파일은 색상 테이블이 존재하지 않으며, 픽셀 데이터 부분에는 각 픽셀의 색상이 파란색(B), 녹색(G), 빨간색(R) 순서의 3바이트 단위로 저장되어 있다. 우리가 흔히 말하는 RGB 순서가 아닌 BGR 순서임을 주의하기 바란다.
BMP 파일을 구성하고 있는 BITMAPFILEHEADER, BITMAPINFOHEADER, RGBQUAD 구조체들은 모두 wingdi.h 파일에 정의되어 있다. 텍스트 편집기로 wingdi.h 파일을 열어보면 각각의 구조체 정의를 찾을 수 있다. 그러나 C/C++ 프로그램에서 BMP 파일을 다룰 경우, wingdi.h 파일보다 windows.h 파일을 포함(include)하는 것이 일반적이다. 이는 windows.h 파일에서 wingdi.h 파일을 포함하면서 더 다양한 windows 관련 사항들을 정의하기 때문이다.