1비트 비트맵 분석 (비트맵 분석 #5)

윤찬호·2022년 11월 14일
0

이미지포맷

목록 보기
5/11

TEST 1.

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 배열(팔레트 배열)이 212^1개이다.

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비트 비트맵 이미지에서 한 줄을 나타내는 바이트 수
10(1/8)byte=1.2510 * (1/8)byte = 1.25 → 4의 배수 맞추기 → 4
즉, 한 줄을 표현하기 위해 4바이트를 사용한다.
(전체 픽셀 데이터 = 4*4 = 16 = biSizeImage)

위에 픽셀 데이터 아래와 같이 분리하면 이해하기 쉬워진다.

2진수로 표시된 데이터에서 빨간색으로 표시된 부분이 실제 영상을 나타내기 위해 사용되는 픽셀 데이터이다. 영상의 가로 크기가 10이므로 한 줄에 10비트의 데이터가 실제 픽셀 데이터이다. (0: 흑, 1: 백)

→ 32비트 중, 10비트만이 실제 사용하는 데이터이고 나머지 22비트는 4의 배수를 맞추기 위한 패딩 비트

TEST 2.

10x4 크기의 흰색+검정색 이미지 (격자 표시는 이해를 돕기 위한 표현입니다.)

비트맵 파일 헤더, 비트맵 정보 헤더, 색상 테이블 정보는 TEST 1. 에서와 같은 내용이므로 생략

픽셀 데이터

우리가 보는 이미지의 최상단 1줄은 흑-흑-백-백-백-백-백-백-백-백 이다.
이를 1비트 데이터로 표현하면 0 0 1 1 1 1 1 1 1 1 으로, 16진수로 나열된 표에서 가장 위에 있는 데이터에 해당한다.

색상 테이블 수정

색상 테이블의 데이터를 위와 같이 수정하면 비트맵 영상의 흑백이 반전되는 것을 볼 수 있다.

0개의 댓글