본문으로 바로가기
반응형

오늘은 24비트 비트맵에 대해서 알아보려고 합니다. 24비트 비트맵에 24는 한 픽셀에 표현되는 bit 수를 의미합니다. 즉, 24비트 비트맵은 한 픽셀을 24bit(3byte)로 표현을 한 것입니다. 8비트 비트맵의 경우 한 픽셀을 8bit로 표현을 한 것이지요. 24비트 비트맵은 한 픽셀을 3byte로 표현을 하기 때문에 2^24의 색상으로 색을 표현을 할 수 있습니다.

 

아래의 URL은 3byte의 Hex값에 따른 색깔이 무엇인지 검색을 할 수 있는 사이트입니다.

https://www.color-hex.com/

 

제 글을 읽고 나시면 왜 0x00 0x00 0x00이 검은색이 되고 0xFF 0xFF 0xFF가 흰색이 되는지 알게 되실 겁니다.

먼저 24비트 비트맵의 포맷에 대해서 알아보겠습니다.

 

 

 24비트 비트맵 포맷

 

 

 

<24비트 비트맵 포맷>

 

 

비트맵 파일 헤더

 

bfType(0x42, 0x4D) : BM(파일 타입)입니다.

 

bfSize(0x35, 0x10, 0x0E, 0x00) : 파일의 전체 사이즈입니다. 리틀 엔디안 형식으로 되어있습니다. 즉, 파일의 총 사이즈는 0x000E1035이며 10진수로 변환을 하면 921,654byte입니다. 파일 사이즈는 우클릭 속성에서도 확인할 수 있습니다.  

 

bfReserved1(0x00, 0x00) : 예약된 공간입니다.

 

bfReserved2(0x00, 0x00) : 예약된 공간입니다.

 

bfOffBits(0x36, 0x00, 0x00, 0x00) : 비트맵 데이터의 시작 위치입니다.

 

 

1
2
3
4
5
6
7
8
typedef struct _BITMAPFILEHEADER
{
WORD bfType;              // BM(파일 타입)   
    DWORD bfSize;             // 파일의 전체 사이즈.
    WORD bfReserved1;        // 예약 공간.
    WORD bfReserved2;        // 예약 공간. 
    DWORD bfOffBits;          // 비트맵 시작 위치.
}BITMAPFILEHEADER;

 

 

 

 

비트맵 헤더 정보

 

 

biSize(0x28, 0x00, 0x00, 0x00) : 비트맵 헤더의 크기(40byte)입니다. 

 

biWidth(0x08, 0x02, 0x00, 0x00) : 비트맵 이미지 넓이(0x280)입니다.

 

biHeight(0xE0, 0x01, 0x00, 0x00) : 비트맵 이미지의 높이(0x1E0)입니다.

 

Width와 Height에 대한 정보는 파일을 우클릭하여 자세히 탭의 상단에서 확인할 수 있습니다.

 

biPlanes(0x01, 0x00) : 항상 1으로 사용하는 이미지 판 수입니다.

 

biBitCount(0x18, 0x00) : 현재 사용하고 있는 비트 수입니다. 24비트 비트맵이기 때문에 값은 0x18이 됩니다.

 

biCompression(0x00 0x00 0x00 0x00) : 압축 유무를 나타냅니다. 압축을 하지 않는 경우 0입니다.

 

biSizeImage(0x00, 0x10, 0x0E, 0x00) : 헤더를 제외한 이미지의 크기. (0x0E1000 = 921,600byte)

 

biXPelsPerMeter(0xC4, 0x0E, 0x00, 0x00) : X축의 해상도. (미터당 픽셀 수)

 

biYPelsPerMeter(0xC4, 0x0E, 0x00, 0x00) : Y축의 해상도. (미터당 픽셀 수)

 

biClrUsed(0x00, 0x00, 0x00, 0x00) : 실제 사용되는 색상의 수.

 

biClrImportant(0x00, 0x00, 0x00, 0x00) : 주로 사용되는 컬러 수.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct _BITMAPINFOHEADER
{
    DWORD    biSize;                // 비트맵 헤더 크기.
    LONG    biWidth;             // 비트맵 이미지 넓이.
    LONG    biHeight;             // 비트맵 이미지의 높이
    WORD    biPlanes;              // 항상 1으로 사용하는 이미지 판 수.
    WORD    biBitCount;             // 현재 사용하고 있는 비트수.
    DWORD    biCompression;        //  압축 유무
    DWROD    biSizeImage;         // 헤더를 제외한 이미지의 크기.
    LONG    biXPelsPerMeter;     // X축의 해상도.
    LONG    biYPelsPerMeter;     // Y축의 해상도.
    DWORD    biClrUsed;            // 실제 사용되는 색상의 수.
    DWORD    biClrImportant;        //주로 사용되는 컬러 수.
}BITMAPINFOHEADER;

 

 

 

 

픽셀 데이터

 

픽셀 데이터에 대해서 알아보도록 하겠습니다. 빨간색으로 표시한 부분은 Header(54byte) 이후에 있는 픽셀 데이터입니다. 24비트 비트맵은 픽셀 하나를 3byte라고 했는데요, 첫 번째 byte는 B(Blue), 두 번째 byte는 G(Green), 세 번째 Byte는 R(Red)가 됩니다.

 

 

 

픽사 베이에서 받은 파일을 24비트 비트맵으로 변환을 했는데요, 0xFF 0xFF 0xFF. . . 로 표현이 되는 부분이 아랫부분입니다. 하단에서 상단으로 좌측에서 우측으로 Data가 표현이 되고 있습니다. 0xFF(B), 0xFF(G), 0xFF(R) 빛의 3원색이 합쳐져 흰색으로 표현이 되게 됩니다. 0xFF로 표시된 부분의 일부를 0x00을 채워 검은색으로 변경해보도록 하겠습니다.

 

데이터의 일부를 0x00으로 채웠습니다. 결과를 한번 확인해보겠습니다.

 

 

그림의 아랫부분에 검은색 줄이 보이시나요? 데이터의 일부를 0x00을 채웠기 때문에 생긴 것입니다. 이와 같은 원리로 0xFF(B) 0x00(G) 0x00(R)로 3byte씩 채우게 되면 채워진 부분이 파란색으로 렌더링이 됩니다.

 

파란색: 0xFF, 0x00, 0x00
초록색 : 0x00, 0xFF, 0x00

빨간색 : 0x00, 0x00, 0xFF

검은색 : 0x00, 0x00, 0x00

흰색 : 0xFF, 0xFF, 0xFF

 

- 빛의 3원색을 생각하시면 됩니다. 모두 조합을 하면 흰색이 되고 R, G, B를 모두 사용하지 않으면 검은색이 됩니다.

 

 

2019/08/25 - [프로그래밍/C#] - C# 마우스 제어(클릭, 좌표 이동)

2019/10/24 - [프로그래밍] - 블루투스의 모든 것 - Bluetooth COD(Class Of Device)란?

2019/11/05 - [프로그래밍] - 블루투스의 모든 것 - Bonding과 Pairing의 차이

2019/12/22 - [프로그래밍/C] - 프로그래머스 2016년, 날짜에 따른 요일 구하기

2020/01/05 - [프로그래밍/C] - 이중 연결 리스트(Double linked list), 이중 원형 연결 리스트 예제

 

반응형