10x4 크기의 흰색 이미지 (격자 표시는 이해를 돕기 위한 표현입니다.)
이 비트맵 파일을 Hex에디터로 열어보면 아래와 같다.
빨간색으로 표시된 부분이 비트맵 파일 헤더 (14byte)
이다.
bfType | 42 4D (BM) | BMP 파일 식별자 | |
bfSize | 4E 00 00 00 | BMP 파일 크기 | 78 (리틀 엔디안) |
bfReserved1 | 00 00 | 예약된 공간1 | |
bfReserved2 | 00 00 | 예약된 공간2 | |
bfOffBits | 3E 00 00 00 | 픽셀 데이터 시작 위치 | 62 (리틀 엔디안) |
크기를 계산할 때는 '리틀 엔디안'으로 계산한다. 이후에는 리틀 엔디안을 직접적으로 언급하지 않는다.
파란색으로 표시된 부분이 비트맵 정보 헤더 DIB (40byte)
이다.
biSize | 28 00 00 00 | 비트맵 정보 헤더 크기 | 40 |
biWidth | 0A 00 00 00 | 비트맵 가로 크기 (px) | 10 |
biHeight | 04 00 00 00 | 비트맵 세로 크기 (px) | 4 |
biPlanes | 01 00 | 사용하는 색상판의 수 (항상 1) | 1 |
biBitCount | 01 00 | 픽셀 하나를 표현하는 비트 수 | 1 |
biCompression | 00 00 00 00 | 압축방식 (보통 비트맵은 압축을 하지 않기 때문에 0) | 0 |
biSizeImage | 10 00 00 00 | 비트맵 이미지의 픽셀 데이터 크기 |
16 |
biXPelsPerMeter | 00 00 00 00 | 비트맵 이미지의 가로 해상도 (미터당 픽셀 dpm) | 0 |
biYPelsPerMeter | 00 00 00 00 | 비트맵 이미지의 세로 해상도 (미터당 픽셀 dpm) | 0 |
biClrUsed | 00 00 00 00 | 색상 테이블에서 실제 사용되는 색상 수 | 0 |
biClrImportant | 00 00 00 00 | 비트맵을 화면에 표현하기 위해 필요한 색상 인덱스 수 | 0 |
비트맵 정보 헤더 다음에 나오는 빨간색으로 표시된 8바이트의 데이터가 색상 테이블이다.
1비트 비트맵 영상은 RGBQUAD 배열(팔레트 배열)이 개이다.
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved; // 사용하지 않는 데이터
} RGBQUAD
첫번째 빨간색 사각형 00 00 00 00
을 보면 rgbBlue, rgbGreen, rgbRed의 값이 모두 0인 것을 볼 수 있다. 즉, 첫번째 RGBQUAD 배열은 검정색을 나타낸다.
두째 빨간색 사각형 FF FF FF 00
을 보면 rgbBlue, rgbGreen, rgbRed의 값이 모두 255(FF)인 것을 볼 수 있다. 즉, 두번째 RGBQUAD 배열은 흰색을 나타낸다.
1비트 비트맵은 검정색, 흰색 2개의 RGBQUAD 배열(팔레트 배열)로 구성되어 있음을 알 수 있다.
(검정색, 흰색 2가지 색상만 사용한다.)
비트맵 정보 헤더의 biSizeImage (픽셀 데이터의 크기) 항목을 보면 값이 16(byte)으로 표시되어 있다.
일반적으로 1비트 비트맵 이미지는 1픽셀을 표현하는데 1비트를 사용한다.
TEST1 에서 사용하는 샘플 비트맵 의 크기는 10x4이므로 총 40픽셀의 비트맵이다.
그렇다면 5byte (5*8bit=40)만으로 비트맵 이미지를 표현할 수 있지만 실제로는 16바이트를 사용하고 있다.
이렇게 되는 이유는 앞에서 살펴본 비트맵의 특징 영상의 가로 크기는 4의 배수 형태
때문이다.
10x4 크기의 1비트 비트맵 이미지에서 한 줄을 나타내는 바이트 수
→ 4의 배수 맞추기 → 4
즉, 한 줄을 표현하기 위해 4바이트를 사용한다.
(전체 픽셀 데이터 = 4*4 = 16 = biSizeImage)
위에 픽셀 데이터 아래와 같이 분리하면 이해하기 쉬워진다.
2진수로 표시된 데이터에서 빨간색으로 표시된 부분이 실제 영상을 나타내기 위해 사용되는 픽셀 데이터이다.
영상의 가로 크기가 10이므로 한 줄에 10비트의 데이터가 실제 픽셀 데이터이다. (0: 흑, 1: 백)
→ 32비트 중, 10비트만이 실제 사용하는 데이터이고 나머지 22비트는 4의 배수를 맞추기 위한 패딩 비트
10x4 크기의 흰색+검정색 이미지 (격자 표시는 이해를 돕기 위한 표현입니다.)
비트맵 파일 헤더, 비트맵 정보 헤더, 색상 테이블 정보는 TEST 1. 에서와 같은 내용이므로 생략
우리가 보는 이미지의 최상단 1줄은 흑-흑-백-백-백-백-백-백-백-백
이다.
이를 1비트 데이터로 표현하면 0 0 1 1 1 1 1 1 1 1
으로, 16진수로 나열된 표에서 가장 위에 있는 데이터에 해당한다.
색상 테이블의 데이터를 위와 같이 수정하면 비트맵 영상의 흑백이 반전되는 것을 볼 수 있다.
정말 많은 도움이 되었습니다. 감사합니다!