비트맵 구조 (비트맵 분석 #4)

윤찬호·2022년 3월 7일
0

이미지포맷

목록 보기
4/11

1. 비트맵 파일의 구조

비트맵 파일 헤더 비트맵 파일에 대한 일반 정보 (비트맵 파일 식별 정보, 파일 크기, 데이터 위치) 14byte
비트맵 정보 헤더 (DIB) 비트맵 그림에 대한 자세한 정보 (가로/세로 크기, 해상도, 픽셀의 비트 수) 40byte
색상 테이블 (1,4,8 비트) 인덱스 컬러 비트맵에 쓰이는 색의 정의 (16비트 이상은 색상 테이블 없음) 가변
픽셀 데이터 그림 파일의 실제 색상 정보 가변

2. 비트맵 파일 헤더

멤버크기(byte)설명offset
bfType2BMP 파일 매직 넘버. 비트맵 파일임을 나타내기 위해 항상 'BM'이라는 값을 저장한다.
ASCII 코드로 0x42(B), 0x4D(M)이 저장된다.
0 1
bfSize4BMP 파일의 크기를 바이트 단위로 나타낸다.2 3 4 5
bfReserved12현재는 사용하지 않으며 미래를 위해 예약된 공간. 항상 0의 값을 갖는다.6 7
bfReserved22현재는 사용하지 않으며 미래를 위해 예약된 공간. 항상 0의 값을 갖는다.8 9
bfOffBits4비트맵 데이터의 시작 위치를 나타낸다.
"비트맵 파일 헤더 + 비트맵 정보 헤더 + 색상 테이블" 크기와 같다.
10 11 12 13

3. 비트맵 정보 헤더 (DIB)

멤버크기(byte)설명offset
biSize4비트맵 정보 헤더 크기. 일반적으로 40이며, 40이 아닌 경우 확장형 DIB이다.14 15 16 17
biWidth4비트맵의 가로 크기 (px)18 19 20 21
biHeight4비트맵의 세로 크기 (px)
> 양수: 이미지의 상하가 뒤집혀서 저장된 상태 (일반적으로 양수)
> 음수:이미지가 그대로 저장된 상태
22 23 24 25
biPlanes2사용하는 색상판의 수 (항상 1)26 27
biBitCount2픽셀 하나를 표현하는 비트 수 (1, 4, 8, 16, 24, 32)28 29
biCompression4압축방식 (보통 비트맵은 압축을 하지 않기 때문에 0)30 31 32 33
biSizeImage4비트맵 이미지의 픽셀 데이터 크기34 35 36 37
biXPelsPerMeter4비트맵 이미지의 가로 해상도 (미터당 픽셀 dpm)38 39 40 41
biYPelsPerMeter4비트맵 이미지의 세로 해상도 (미터당 픽셀 dpm)42 43 44 45
biClrUsed4색상 테이블에서 실제 사용되는 색상 수.
0이면, biBitCount에서 지정한 색상수를 모두 사용하는 것을 나타낸다.
0이 아니면, RGBQUAD 구조체 배열의 크기를 지정한다. 일반적으로 0이다.
46 47 48 49
biClrImportant4비트맵을 화면에 표현하기 위해 필요한 색상 인덱스 수.
0이면 모든 색상이 필요함을 나타내며, 일반적으로 0이다.
50 51 52 53

4. 색상 테이블

1, 4, 8 비트 비트맵의 경우 색을 표현하기 위해 색상 테이블(팔레트)을 사용한다

색상 테이블은 인덱스에 의한 컬러값을 저장하기 위한 구조체이다.
이 구조체를 사용하여 팔레트의 수 만큼 배열을 할당하여 저장한다. (RGBQUAD 배열)

typedef struct tagRGBQuad {
	BYTE rgbBlue;
    BYTE rgbGreen;
    BYTE rgbRed;
    BYTE rgbReserved; // 예약된 값으로 사용하지 않는다. 항상 0으로 표현
}

팔레트를 사용하는 영상의 픽셀은 색상 값 자체를 가지는 것이 아니라 그 픽셀이 사용하는 팔레트 색상의 번호를 가지게 된다.

팔레트를 사용할 경우 보통 (0,0,0,0)에서 (255,255,255,0) 값을 순차적으로 가진다.

ex) 1비트 비트맵 영상은 팔레트 배열의 크기가 2이다. (212^1)
색상 테이블의 크기: 24=82 * 4 = 8

8비트 비트맵 영상은 팔레트 배열의 크기가 256이다. (282^8)
색상 테이블의 크기: 2564=1024256 * 4 = 1024


5. 픽셀 데이터

1,4,8비트 비트맵의 경우 색상 테이블 영역 다음에 실제 영상의 픽셀 정보를 갖고 있는 픽셀 데이터가 나온다. 색상 테이블이 없는 비트맵의 경우 비트맵 정보 헤더(DIB) 이후에 픽셀 데이터가 나온다.

1비트 비트맵의 경우, 하나의 픽셀을 표한하기 위해 1비트를 사용한다.

트루컬러 비트맵(24bit)의 경우, 하나의 픽셀을 표현하기 위해 3바이트를 사용한다. (B: 1byte, G: 1byte, R: 1byte) B, G, R각각의 색상은 0~255 (0x00~0xFF) 사이의 정숫값으로 표현된다.
(일반적으로 RGB라고 많이 부르지만, 실제 색상이 저장되는 순서는 RGB순서가 아닌 BGR순서이다.)

보통 비트맵은 상하가 뒤집힌 상태로 저장된다. 따라서 픽셀 데이터의 첫번째 데이터는 비트맵 이미지의 가장 아래줄 첫번째 픽셀을 나타낸다.
(비트맵 정보 헤더의 biHeight값이 음수인 경우에만 보이는 그대로 저장된다. 대부분의 경우 양수로 저장되기 때문에 상하가 뒤집힌 상태로 저장된다.)

또한 비트맵은 효율적인 데이터 관리를 위해 영상의 가로 크기를 4의 배수 형태로 저장한다.

자세한 내용은 아래 링크의 3번, 4번 내용 참고.
비트맵 특징 (비트맵 분석 #3)

0개의 댓글