그럼 BMP파일구조에 대해 먼저 알아보자.
BMP파일구조
BMP파일 자체에 대한 궁금증은 다른 자료들을 찾아보면 된다.
파일헤더
|
영상헤더
|
팔레트정보
|
영상데이터
|
BMP파일의 구조를 나타냈다. 아주 간단하다. 파일헤더, 영상헤더, 팔레트 정보, 영상데이터 이렇게 들어가있다.
자 그럼 각각에 대해 알아보자.
1. 파일헤더
BMP파일에 대한 정보를 가지고 있다. 아래의 표는 파일헤더에 있는 내용을 나타낸다.
Filed
|
Bytes
|
설명
|
bfType
|
2
|
0x4D42 (‘BM’) 이란 데이터가 있어야 한다.
|
bfSize
|
4
|
파일의 전체 크기.
|
bfReserved1
|
2
|
사용하지 않음.
|
bfReserved2
|
2
|
사용하지 않음.
|
bfOffBits
|
4
|
영상데이터의 시작위치를 나타낸다.
|
typedef struct {
short bfType;
unsigned int bfSize;
short bfReserved1;
short bfReserved2;
unsigned int bfOffBits;
} BITMAPFILEHEADER
bfType
bfType에 들어간 내용이 중요한데 이곳에 0x4D42 문자로 "BM"이라는 값이 있어야 일차적으로 입력된 파일이 BMP파일인지 아닌지 걸러진다.
즉 파일명은 *.bmp로 되어있더라고 파일 헤더를 깠을 때 bfType에 0x4D42의 값이 없다면 BMP파일이 아닌것으로 간주하면 된다.
bfSize
bfSize는 BMP파일의 전체 사이즈를 나타낸다.
사용하지 않는 영역이다. 그냥 사용하지 않는다고 생각하고 있으면 됨. 하지만 헤더를 깠을때 0의 값이 들어가 있다.
실제 영상데이터의 위치를 나타낸다. 여기에 있는 값은 파일 헤더, 인포헤더의 총 사이즈와 같다.
bfReserved1 & 2
사용하지 않는 영역이다. 그냥 사용하지 않는다고 생각하고 있으면 됨. 하지만 헤더를 깠을때 0의 값이 들어가 있다.
bfOffBits
실제 영상데이터의 위치를 나타낸다. 여기에 있는 값은 파일 헤더, 인포헤더의 총 사이즈와 같다.
2. 영상헤더
BMP파일의 영상헤더 (Info Header)에 대해 알아보자. 이곳에는 실제 RAW데이터에 대한 정보들이 포함되어 있다.
Filed
|
Bytes
|
설명
|
biSize
|
4
|
영상헤더의 크기
|
biWidth
|
4
|
BMP의 가로 픽셀 수
|
biHeight
|
4
|
BMP의 세로 픽셀 수
|
biplanes
|
2
|
색상 면 ->
1의 값.
|
biBitCount
|
2
|
픽셀당 비트 수
|
biCompression
|
4
|
압축의 형태
|
biSizeImage
|
4
|
실제 데이터의 크기
|
biXPixelPerMeter
|
4
|
미터당 가로 픽셀 수
|
biYPixelPerMeter
|
4
|
미터당 세로 픽셀 수
|
biClrUsed
|
4
|
BMP에서 사용되는 색상 수
|
biClrImportant
|
4
|
BMP 출력에 필요한 색상 수
|
상위의 표를 구조체로 나타내면 다음과 같이 작성할 수 있다.
typedef struct {
unsigned int biSize;
unsigned int biWidth;
unsigned int biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
int biCompression;
unsigned int biSizeImage;
unsigned int biXPixelPerMeter;
unsigned int biYPixelPerMeter;
int biClrUsed;
int biClrImportant;
} BITMAPINFOHEADER;
각각의 필드에 대한 설명은 표를 보면 나와있다.
3. 팔레트 정보
4. 영상데이터
영상데이터에 영상은 꺼꾸로 들어가 있으며 이부분을 참고해서 코딩하길 바란다.
3. 팔레트 정보
4. 영상데이터
영상데이터에 영상은 꺼꾸로 들어가 있으며 이부분을 참고해서 코딩하길 바란다.