본문 바로가기

Win32 Api/강의

비트맵뷰어

그럼, 이번에 공구한 TFT-LCD는 보통 QVGA급(320 x 240; Quarter VGA, 즉, 640 x 480 VGA의 1/4에 해당하는 크기를 말함)이므로 일단 320 x 240 사이즈의 테스트용 비트맵 파일을 가지고 실험을 해봤다.

테스트 사진 중에 가로로 긴 사진이 없어서 세로로 긴 사진을 가지고 테스트했다.

(그러나, 사진을 보면 잘했다는 생각이 들것임. *^^*) 일단, 완소 김태희 양의 사진을 가지고 분석했다.
 

1.jpg

 
완소 김태희 사진이 들어있는 BMP파일을 첨부파일을 울트라 에디터로 열어보면 바이너리 모드로 열린다. 그리고, 탐색기에서 해당 비트맵 파일의 등록정보를 열어서 파일 사이즈 및 비트맵 정보를 확인하자. 마우스로 오른쪽 클릭하고 등록정보를 확인하면 파일 크기가 230,454 바이트(=16진수로는 0x38436 바이트)이고, 비트 깊이는 24비트임을 알 수 있다. 물론 크기는 240 x 320 픽셀이다.

 자, 그 다음에 울트라 에디터로 살짝 파일을 열어보면 파일 앞 부분이 다음과 같이 되어 있음을 알 수 있다.

2.jpg

 위의 그림에서 빨간색 박스로 그려진 부분이 BMP파일의 헤더에 해당한다. 위의 헤더파일의 구조는 다음과 같다.

3.jpg

 생각보다 BMP 파일의 헤더 구조는 단순하다. 그리고, 저 헤더부분 뒤에 이미지의 RGB 데이터가 바로 이어지기 때문에 BMP파일에서 RGB 데이터를 추출하고자 할 때에는 헤더부분을 제외한 다음 부분부터 파싱을 하면 된다. 헤더 부분을 잠시 살펴보면 모든 BMP 파일은 첫 두바이트가 0x41, 0x4D로 시작한다. 이를 보통 매직코드라고 부른다. 대부분의 특정한 포맷을 가진 파일들은 위와 같은 매직코드를 가지고 있는 경우가 많다. 그 다음 필드는 BMP 파일의 사이즈인데, 아까 등록정보로 0x38436 바이트라고 했는데, 그 값이 뒤집혀서(즉, 리틀 엔디안 형식으로) 저장되어 있다. 그리고, 다섯번째 필드를 보면 실제 이미지 데이터가 시작하는 오프셋의 위치를 담고 있는데... 0x36번째 부터란다. 헤더 부분의 총크기를 계산하면 0 ~ 0x35이므로 총 0x36바이트를 가진다. 따라서, 오프셋의 위치와 정확히 일치함을 알 수 있다. 그리고, image width/height in pixels 필드는 그림 파일의 가로/세로 픽셀 수에 해당하는데 저 값을 10진수로 바꿔보면 240 x 320이다. 그 다음 가장 중요한 "size of image data in bytes"는 실제 이미지 데이터의 크기를 말한다(데이터 크기가 정말 저 값이 맞는지는 각자 확인하기 바람 *^^*). 또한, number of bits per pixel 은 한 픽셀당 비트수를 말하는데, 0x18이니까 십진수로 24비트이다. 아까 등록정보에서 확인한 값과 일치한다. 이런 식으로 헤더정보를 파싱하면 된다.


이제, 헤더의 다음부분 부터 이미지 데이터가 어떤 식으로 저장되어 있는지 살펴보면...

신기하게도... 좌측상단의 점부터 데이터를 저장하고 있는 것이 아니라, 맨 아래줄부터 데이터가 저장된다.

무슨 말인고 하면...

 

4.jpg

 

위의 그림처럼 BMP파일의 그림 데이터는 라인단위로 저장되는데... 이미지의 가장 아래 라인부터 역순으로 저장된다. 게다가, 저장되는 순서도 RGB(8비트, 8비트, 8비트) 순서로 저장되는 것이 아니라 BGR 순서로 저장된다. 정말???

5.jpg

 

위의 모서리 값은 실제 이미지 데이터의 RGB값을 그래픽 뷰어 프로그램으로 찾아 본 것인데, 헤더 부분의 그 다음 3바이트를 확인해보면...

 

EC, EF, E6

 

임을 알 수 있는데, 그 값은 정확히 위 의 그림에서 ③번 모서리의 RGB의 역순임을 알 수 있다. 이런 식으로 BMP파일에서 RGB 데이터를 추출하면 된다


'Win32 Api > 강의' 카테고리의 다른 글

CAM을 활용한 영상처리 프로그램  (0) 2011.03.03
2010년 12월 1일 수요일  (0) 2010.12.02
2010년 11월 22일 월요일 (첫 강의)  (0) 2010.11.22