2014년 8월 7일 목요일

BMP 구조

BMP 파일을 읽어서 쓰기위해 BMP파일의 구조를 파악하고 코드를 간단히 나마 구현해봤다. 윈도우에서 하면 금새 될텐데 왜 그랬냐? Linux에서 해보려고.

그럼 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파일의 전체 사이즈를 나타낸다.


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. 영상데이터
영상데이터에 영상은 꺼꾸로 들어가 있으며 이부분을 참고해서 코딩하길 바란다.



댓글 없음:

댓글 쓰기