DibSection( ), DDB(Dependent), DIB(Independent),
Bitmap Stride(Multiple of 4), bitCount, 등, 비트맵의 세부 구조를 변경하는 메모리 실습을 하는데에
필요했던 정보들을 모아놓았다.
포스팅을 읽기 전에 참고하면 좋은 자료.
https://docs.microsoft.com/ko-kr/windows/win32/learnwin32/windows-coding-conventions
Bitmap에 대한 유용한 자료들을 제공해준 사이트들.
https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=tipsware&logNo=220986173576
https://blog.naver.com/tipsware/220995733415
https://programmer.group/introduction-to-audio-and-video-04-bmp-image-four-byte-alignment.html
https://m.blog.naver.com/PostView.naver?blogId=hanulnam&logNo=10005345124&proxyReferer=
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapinfoheader
https://m.blog.naver.com/ontow/140118496287
https://en.m.wikipedia.org/wiki/BMP_file_format
https://stackoverflow.com/questions/7502588/createcompatiblebitmap-and-createdibsection-memory-dcs
http://hyeongjin-kim.blogspot.com/2013/05/ddb-dib.html?m=1
https://hubbleconstant.tistory.com/m/40
https://yongho1037.tistory.com/m/284
https://m.cafe.daum.net/smhan/dT3V/26
https://docs.microsoft.com/en-us/windows/win32/gdi/bitmaps
https://m.blog.naver.com/yeonsu1936/222023028283
영상 처리 프로그래밍이이라는 것이 Win32API 게임 개발과, bitmap에 대한 자료도 많이 함유되어 있는 것 같다.
영상 처리가 게임 개발과 매우 밀접하다는 것을 알았다.
추후 bmp 영상을 화면에 출력하는 프로젝트를 진행하는 경우에도,
BMP 파일에 대해 이해를 하고 있어야 한다. (bmp 파일은 영상 출력 프로그래밍 실습에도 자주 쓰인다.)
색상 테이블(팔레트) 이란?
256개 이하의 색상을 사용하는 비트맵은 BITMAPINFOHEADER 뒤에 RQBQUAD 구조체의 배열로 구성된 색상 테이블color table이 존재한다. 색상 테이블은 비트맵에서 사용되는 색상 정보를 담고 있는 영역으로 palette(팔레트) 라고도 한다. RGBQUAD 구조체는 다음과 같은 형태로 정의되어 있다.
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
BYTE는 unsigned char와 동일한 자료형으로써, 1바이트의 크기를 갖는다. 그러므로 RGBQUAD 구조체의 크기는 4바이트이다. 멤버 이름을 보면 쉽게 알 수 있듯이, rgbBlue는 파란색, rgbGreen은 녹색, rgbRed는 빨간색 색상 정보를 표현한다. 마지막 1바이트 rgbReserved는 사용하지 않고 있으며, 항상 0으로 표현한다. 구조체의 이름은 RGBQUAD이지만 실제 색상이 저장되는 순서는 RGB 순서가 아니라 BGR 순서인 것을 명심해야 한다. (대부분 리틀엔디안 체계이기 때문이다.)
▼ 그림 : 그레이스케일 비트맵 예제 파일(gray.bmp)
이 비트맵은 각각의 가로줄의 그레이스케일 값이 각각 64, 128, 192, 255로 구성되어 있고
4*4 행렬로 구성된, 간단한 비트맵 파일이다.
Grayscale 비트맵 파일은 256개의 RGBQUAD 배열이 존재하며, 각각의 원소에는 rgbBlue, rgbGreen, rgbRed 값이 동일한 값으로 설정되어 있다. 그레이스케일 비트맵 파일에서 팔레트는 검정색에 해당하는 (0, 0, 0, 0)부터 시작하여 흰색에 해당하는 (255, 255, 255, 0)까지 차례대로 밝기 값이 증가하도록 설정되어 있다. 즉, 그레이스케일 BMP 파일은 회색조의 고정된 형태의 색상 테이블을 가지는 256 색상 BMP 파일의 특별한 형태라고 말할 수 있다.
TRUE COLOR 비트맵 파일은 palette가 존재하지 않는다. 트루컬러 영상에서 표현 가능한 색상 수가 224=16,777,216이기 때문에 팔레트를 만드는 것 자체가 BMP 파일 용량에 무리를 줄 수 있기 때문이다.
Bitmap 이란?
비트맵(BMP)은 컴퓨터에서 영상을 표현하는 대표적인 방법이다.
사용시 단순히 그림을 복사하여 화면에 보여주기 때문에 벡터를 이용한 방식보다 빠르다.
windows에서 지원하는 비트맵은 두 가지가 있다.
1. 장치 의존 비트맵(Device Dependent Bitmap) DDB
2. 장치 독립 비트맵(Device Independent Bitmap) DIB
이 중 영상처리에서는 DIB를 사용한다.
그 이유는 출력장치가 달라지더라도 어디에서나 비트맵이 출력되기 때문이다. 이는 DIB에 자신의 색상을 표현하는 색상 테이블이 있기 때문이다.
*참고 : 비트가 모여서 픽셀, 픽셀이 모여서 영상 및 이미지을 구성한다.
BMP 파일
BMP 파일은 확장자가 .bmp인 파일을 이야기 하며, 다른 영상 파일 형식과 달리 압축을 하지 않고 DIB구조를 그대로 파일로 저장한 형태이다.
BMP 파일 구조
구조는,
- 비트맵 파일 헤더(BITMAPFILEHEADER) : BMP 파일 자체에 대한 정보를 담고 있는 영역,
- 비트맵 정보 헤더(BITMAPINFOHEADER) : 비트맵 영상의 크기, 색상 수 등에 대한 정보를 담고 있는 영역,
- 색상 테이블(팔레트) : 비트맵의 영상의 색상 정보를 담고 있는 부분,
비트맵의 색상 수에 따라 색상 테이블이 존재하지 않을 수도 있다.
- 픽셀 데이터 : 각 픽셀의 색상 정보를 표현하는 공간(각 픽셀마다 3바이트를 사용해 BGR 표현)
의 4가지로 구성 되어있다.
BITMAPINFOHEADER 구조체, 색상 테이블, 픽셀 데이터 부분을 합쳐 packed-DIB 포맷이라고 부르며 단순히 DIB구조라고 부르기도 한다.
BMP 파일 구조 중 색상 테이블 부분은 비트맵 파일의 속성에 따라 존재하지 않을 수도 있다고 했는데,
BMP 파일의 영상이 가지고 있는 색상이 256 색상 이하이면, 즉 생상 수가 2, 16, 256개인 경우에는 색상 테이블이 존재한다.
이와 달리 2의 24승 가지 색상을 표현할 수 있는 트루컬러 영상에는 색상 테이블 정보가 존재하지 않아 비트맵 정보 헤더 뒤에 픽셀 데이터 정보가 나타난다.(용량이 너무 크기 때문에)
그레이스케일 영상의 BMP 파일에는 256단계 무채색을 표현하는 RGBQUAD 배열이 저장되어있다. RGBQUAD 구조체 하나의 크기가 4바이트이므로 그레이 스케일 비트맵의 색상 테이블 영역의 크기는 256*4=1024바이트이다.
픽셀 데이터 부분에는 각 픽셀의 그레이스케일을 표현하는 RGBQUAD 배열의 인덱스가 저장되어 있다.
각각의 BMP파일 구조체에 대한 내용의 정의는 너무 많아서 필요한 정보를 검색해서 얻는 것이 좋다고 생각한다.
일반적으로 비트맵은 상하가 뒤집힌 상태로 저장된다.
BitmapInfoHeader 구조체의 biheight가 양수로 저장되기 때문에 항상 뒤집힌 상태라고 생각해도 무방하다.
또한 효율적인 데이터 관리를 위해 영상의 가로 크기를 4의 배수로 저장한다. 예를들어 영상의 크기가 3x3이라 하더라도
실제로는 여분의 크기 1바이트를 추가해 4x3를 사용한다.
'(2022) 공부 (Study) > 게임 개발 (Development)' 카테고리의 다른 글
[C++] 정적(static) 키워드의 개념과 활용 (0) | 2022.04.20 |
---|---|
[Win32API] Bitmap에 대한 정리 (2) - bitColor 수정 및 출력 (0) | 2022.04.19 |
[Win32API] File 입출력 (0) | 2022.04.16 |
2진수 그리고 16진수에 대한 정리 (0) | 2022.04.16 |
[Win32API] GetAsyncKeyState() 와 키 입력 받기 (2) (0) | 2022.04.14 |