해당 포스트는 "열혈강의 영상처리 프로그래밍" 책의 내용을 요약한 것이다.
※ 영상 파일의 형식
- 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)값을 순차적으로 가진다. 이번 영상 입출력 프로그램 만들기 예제에서 실제로 팔레트를 사용할 예정이다.
'영상처리 프로그래밍' 카테고리의 다른 글
영상 입출력 프로그램 만들기(3) - MDI에서 화면 출력 (0) | 2017.06.07 |
---|---|
영상 입출력 프로그램 만들기(2) - 비트맵 파일 읽기와 쓰기 (0) | 2017.06.06 |
영상 데이터 클래스 구현(5) (0) | 2017.06.04 |
영상 데이터 클래스 구현(4) (0) | 2017.06.04 |
영상 데이터 클래스 구현(3) (0) | 2017.06.04 |