81.1 비트맵 파일 포맷 알아보기
비트맵 파일은 바이너리 형식이므로 메모장 등 텍스트 편집기로 열어도 내용을 알아볼 수 없습니다. 따라서 비트맵 파일에서 픽셀 정보를 읽으려면 먼저 비트맵 파일의 구조를 알아야 합니다.
다음은 비트맵 파일의 구조이며 비트맵 파일은 픽셀 하나를 몇 비트로 저장하느냐에 따라 구조가 달라집니다. 이번 예제에서는 가장 널리 사용하는 24비트 비트맵을 사용하겠습니다. 따라서 색상 테이블은 처리하지 않습니다.
비트맵 파일 헤더는 비트맵 파일 식별 정보, 파일 크기, 데이터 위치 등의 정보를 담고 있으며 DIB(Device Independent Bitmap) 헤더는 가로, 세로 크기, 해상도, 픽셀의 비트 수 등 그림의 자세한 정보를 담고 있습니다.
픽셀 데이터에는 그림 파일의 실제 색상 정보가 들어갑니다. 단, 픽셀당 색상 수가 16비트 미만일 때는 색상 테이블에 따로 색상 정보를 저장하고, 픽셀 데이터에서는 색상 테이블의 인덱스를 저장합니다. 우리는 24색 비트맵 파일을 사용할 것이므로 색상 테이블은 처리하지 않습니다.
이제 비트맵 파일 헤더(BITMAPFILEHEADER)의 구조입니다.
멤버 | 크기(바이트) | 설명 |
---|---|---|
bfType | 2 | BMP 파일 매직 넘버. 비트맵 파일이 맞는지 확인하는데 사용하며 ASCII 코드로 0x42(B), 0x4D(M)가 저장됩니다. |
bfSize | 4 | 파일 크기(바이트) |
bfReserved1 | 2 | 현재는 사용하지 않으며 미래를 위해 예약된 공간 |
bfReserved2 | 2 | 현재는 사용하지 않으며 미래를 위해 예약된 공간 |
bfOffBits | 4 | 비트맵 데이터의 시작 위치 |
다음은 비트맵 정보 헤더(BITMAPINFOHEADER)의 구조입니다.
멤버 | 크기(바이트) | 설명 |
---|---|---|
biSize | 4 | 현재 비트맵 정보 헤더(BITMAPINFOHEADER)의 크기 |
biWidth | 4 | 비트맵 이미지의 가로 크기(픽셀) |
biHeight | 4 | 비트맵 이미지의 세로 크기(픽셀).
|
biPlanes | 2 | 사용하는 색상판의 수. 항상 1입니다. |
biBitCount | 2 | 픽셀 하나를 표현하는 비트 수 |
biCompression | 4 | 압축 방식. 보통 비트맵은 압축을 하지 않으므로 0입니다. |
biSizeImage | 4 | 비트맵 이미지의 픽셀 데이터 크기(압축 되지 않은 크기) |
biXPelsPerMeter | 4 | 그림의 가로 해상도(미터당 픽셀) |
biYPelsPerMeter | 4 | 그림의 세로 해상도(미터당 픽셀) |
biClrUsed | 4 | 색상 테이블에서 실제 사용되는 색상 수 |
biClrImportant | 4 | 비트맵을 표현하기 위해 필요한 색상 인덱스 수 |
24비트 비트맵은 픽셀(RGBTRIPLE)을 파랑(B),초록(G), 빨강(R) 순서로 저장하며 각 색상의 크기는 1바이트입니다. 따라서 픽셀당 3바이트를 사용합니다.
멤버 | 크기(바이트) | 설명 |
---|---|---|
rgbtBlue | 1 | 파랑 |
rgbtGreen | 1 | 초록 |
rgbtRed | 1 | 빨강 |
즉, 우리가 화면에서 보는 24비트 비트맵 파일의 픽셀은 3바이트로 되어 있습니다.
여기서 색상이 파랑, 초록, 빨강 3색이라서 RGBTRIPLE 구조체의 이름에 triple이 들어갑니다. 그리고 구조체 멤버에서 rgb 뒤에 붙는 t도 triple을 의미합니다.
이 책에서 사용된 비트맵 구조체 BITMAPFILEHEADER, BITMAPINFOHEADER와 픽셀 구조체 RGBTRIPLE은 Windows API의 Windows.h 헤더 파일에 정의된 것을 가져와서 만들었습니다. 구조체 이름이 좀 읽기 힘들지만 마이크로소프트에서는 실제로 이렇게 쓰고 있습니다. 구조체에 대한 자세한 내용은 MSDN을 참조하세요.