본문 바로가기
[개발자 로드맵]/영상신호처리 이론 및 실습

비트맵 파일 BMP 포맷 알아보기

by Ramrider 2022. 6. 28.
728x90
반응형
  • 비트맵 파일의 구조 : 비트맵 파일 헤더는 파일 식별정보, 크기, 데이터 위치 등의 정보를 담고 있습니다. 비트맵 정보헤더는 가로, 세로의 크기, 해상도, 픽셀의 비트수 등 그림의 정보를 담고 있습니다. 픽셀데이터에는 그림 파일의 실제 색상 정보가 들어갑니다. 단, 픽셀당 16비트 미만의 경우 팔레트에 색상정보를 저장하고 이미지 비트에서는 색상 테이블의 인덱스를 저장합니다. 

비트맵 파일의 구조

 

  • 비트맵 파일 헤더(BITMAPFILEHEADER)의 구조 : 비트맵 파일에 대한 정보 저장을 위한 구조체입니다.
typedef struct tagBITMAPFILEHEADER {
               WORD      bfType;        // 비트맵파일 여부 확인, "BM"이라는 값을 저장
               DWORD     bfSize;        // 파일의 크기 (바이트)
               WORD      bfReserved1;   // 미래를 위해 예약된 공간 
               WORD      bfReserved2;   // 미래를 위해 예약된 공간
               DWORD     bfOffBits;     // 비트맵 데이터 시작 위치
} BITMAPFILEHEADER

 

  • 비트맵 정보 헤더(BITMAPINFOHEADER)의 구조
typedef struct tagBITMAPINFOHEADER {
               DWORD       biSize;             // 현재 비트맵 정보 헤더의 크기
               LONG        biWidth;            // 이미지의 가로 크기(pixel)
               LONG        biHeight;           // 이미지의 세로 크기(pixel)
               WORD        biPlanes;           // 사용하는 색상판의 수(항상 1)
               WORD        biBitCount;         // 픽셀 1개를 표현하는 비트수
               DWORD       biCompression;      // 압축 방식, 보통 비트맵은 압축하지 않아 0
               DWORD       biSizeImage;        // 이미지 픽셀 데이터 크기
               LONG        biXPelsPerMeter;    // 이미지의 가로 해상도
               LONG        biYPelsPerMeter;    // 이미지의 세로 해상도
               DWORD       biClrUsed;          // 색상 테이블에서 실제 사용되는 색상 수
               DWORD       biClrImportant;     // 비트맵을 표현하기 위해 필요한 색상 엔덱스 수
} BITMAPINFOHEADER

 

  • 팔레트의 구조 : 구조체 배열로 저장되며, 16비트이면 16개 길이의 배열, 256이면 256길이의 배열로 저장됩니다. 또한 B-G-R 순서로 저장하며 각 색상의 크기는 1바이트로 픽셀당 3바이트가 사용됩니다. 트루컬러 이미지의 경우에는 팔레트가 필요하지 않습니다.
typedef struct tagRGBQUAD {
              BYTE rgbBlue;        // 파란색 성분
              BYTE rgbGreen;       // 녹색 성분
              BYTE rgbRed;         // 빨간색 성분
              BYTE rgbReserved;    // 확장을 위해서 예약된 값
} RGBQUAD;

 

※ 주의사항

  • 메모리 상에는 이미지가 반대로(거꾸로) 저장됩니다.
  • 가로의 길이는 4bite 정수가 되어야합니다. 예를들어 픽셀당 8bit로 표현되는 256컬러 이미지의 가로 길이가 38픽셀이었다면 이미지의 가로줄을 저장하는데에는 38바이트가 필요하겠지만 실제로는 40바이트에 저장되어야 한다는 것이고 나머지 2바이트에는 무의미한 정보가 들어가게 됩니다.

 

참고 학습 자료

 


영상신호처리 자료가 적고 정리가되어 있는 사이트가 부족하여 개인 학습시 많은 시간과 노력이 들어갑니다.

깔끔하게 정리된 자료가 없어 이곳 저곳 돌아다니며 학습하는 시간을 덜어드리고자 합니다.

저 역시 영상신호처리 학습자이자 엔지니어로써 부족한 부분이 많고 노력 중에 있습니다.

더 깊은 이해를 갖고 계신 엔지니어분들께서 댓글로 추가로 가르침을 주시면 개정하여

더 많은 엔지니어들과 지식을 공유하고 나눔하도록하겠습니다.

 

728x90
반응형

댓글