해당 포스트는 "열혈강의 영상처리 프로그래밍" 책의 내용을 요약한 것이다.



※ 영상 파일의 형식

- BMP : 압축을 하지 않고 픽셀 데이터 하나하나가 파일에 기록된다. 나머지 파일 형식은 미리 약속된 형식을 통해 인코딩되 압축된 형태로 저장되며 파일을 읽을 때 디코딩을 수행해야 한다. 이러한 인코딩과 디코딩 코드는 라이브러리를 통해 얻을 수 있다.

- JPG : 디지털 카메라에서 많이 사용

- PNG : pc나 인터넷 환경에서 사용

- gif : 웹에서 많이 사용되고 움직이는 이미지를 표현할 때 사용

 

여기서는 가장 간단한 영상 파일 형식인 비트맵 파일의 입출력을 다룰 예정이다.

 

※ 비트맵 파일의 구조

 

1. 비트맵 파일 헤더

 

//wingdi.h 헤더 파일에 정의
typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;  //비트맵을 뜻하는 'BM' 알파벳이 적혀 있다. 이 변수를 보고 파일이 비트맵인지 알 수 있다.
        DWORD   bfSize;  //파일의 전체 크기
        WORD    bfReserved1;  //사용X
        WORD    bfReserved2;  //사용X
        DWORD   bfOffBits;    //실제 픽셀 데이터의 시작 offset주소를 바이트 수로 나타냄
} BITMAPFILEHEADER

파일 자체에 대한 정보를 담는 부분

WORD는 2byte의 unsigned short형, DWORD는 4byte의 unsigned long형에 해당한다.

bfSize를 16진수로 볼 때 '36 00 24 00'일 경우 파일 전체 크기는 0x24*(2의 16승) + 0x36*(2의 0승) 바이트가 된다. 이와 같은 연산을 하는 이유는 작은 자리의 바이트를 앞에 배치하는 리틀 엔디언 방식 때문이다.

 

 

2. 영상 정보 헤더

 

typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;           //영상 정보 헤더의 크기(40byte)
        LONG       biWidth;          //영상의 가로 픽셀 수
        LONG       biHeight;         //영상의 세로 픽셀 수
        WORD       biPlanes;
        WORD       biBitCount;       //픽셀 당 비트 수로 회색조 영상의 경우 8, rgb 트루 컬러일 경우 24(1,4,8,16,24,32중 하나)
        DWORD      biCompression;    //압축 타입으로 비트맵의 경우 보통 BI_RGB(0)이다.
        DWORD      biSizeImage;      //영상 데이터의 크기
        LONG       biXPelsPerMeter;
        LONG       biYPelsPerMeter;
        DWORD      biClrUsed;
        DWORD      biClrImportant;
} BITMAPINFOHEADER

파일에 저장된 영상 정보를 담는다.

 

 

3. 팔레트 정보

typedef struct tagRGBQUAD {
        BYTE    rgbBlue;
        BYTE    rgbGreen;
        BYTE    rgbRed;
        BYTE    rgbReserved;  //사용X
} RGBQUAD

영상 데이터의 크기를 줄이기 위해 미리 정해진 색상의 집합이다. 팔레트를 사용하는 영상의 픽셀은 색상 값 자체를 가지는 것이 아니라 그 픽셀이 사용하는 팔레트 색상의 번호를 가지게 된다. 이러한 팔레트 정보는 위의 RGBQUAD 구조체를 이용한다. 하지만 최근에 컴퓨터의 연산속도와 메모리 증가로 회색조 영상을 제외하고는 팔레트를 사용하지 않는다. 팔레트를 사용할 경우 보통 (0,0,0,0)에서 (255,255,255,0)값을 순차적으로 가진다. 이번 영상 입출력 프로그램 만들기 예제에서 실제로 팔레트를 사용할 예정이다.

+ Recent posts