본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]일일보고서-정선주(2011년10월10일)

by 알 수 없는 사용자 2011. 10. 10.
728x90
반응형

 



결과

image

Bitmap Data 형식

 

기본적인 Bitmap 화일의 구조

image

보는 것과 같이 BMP파일은 상당히 단순한 구조를 갖고 있습니다. 만약 Window일 경우 windows.h 헤더파일에 정의 되어 있습니다

 

File Header(파일 헤드)

File Header는  BITMAPFILEHEADER라는 구조체에 정의 되어 있습니다.

파일 자체의 정보를 저장하고 있는 구조체로써 다음과 같이 미리 정의 되어 있다

   1:  typedef struct tagBITMAPFILEHEADER
   2:  {
   3:           WORD   bfType;        // "BM" 이라는 값을 저장함(2Byte)
   4            DWORD             bfSize;        // 바이트 단위로 전체파일 크기(4byte)
   5:           WORD              bfReserved1;   // 예약된 변수(2Byte)
   6:           WORD              bfReserved2;   // 예약된 변수(2Byte)
   7:           DWORD             bfOffBits;     // 영상데이터 위치까지의 거리(4Byte)
   8:  } BITMAPFILEHEADER;
   9:   

 

Image Header

영상자체에 대한 정보(영상 헤드)

비트맵 영상에 대한 크기나 흑백, 컬러정보. 팔레트 크기 정보 등을 저장하기 위해서 File Header 다음에 위치한 구조체 변수이다

   1:  typedef struct tagBITMAPINFOHEADER
   2:  {
   3:            DWORD              biSize;                // 이 구조체의 크기(4Byte)  
   4:            LONG               biWidth;               // 픽셀단위로 영상의 폭(4Byte)
   5:            LONG               biHeight;              // 영상의 높이(4Byte)
   6:            WORD               biplanes;              // 비트 플레인 수 (항상 1)(4Byte)
   7:            WORD               biBitCount;            // 픽셀당 비트수 (컬러, 흑백 구별)(2Byte) 
   8:            DWORD              biCompression;         // 압축유무(2Byte)
   9:            DWORD              biSizeImage;           // 영상의 크기 (바이트 단위)(2Byte)
  10:            LONG               biXPelsPerMeter;       // 가로 해상도(4Byte)
  11:            LONG               biYPelsPerMeter;       // 세로 해상도(4Byte)
  12:            DWORD              biClrUsed;             // 실제 사용 색상 수(4Byte)
  13:            DWORD              biClrImportant;        // 중요한 색상 인덱스(4Byte)
  14:  } BITMAPINFOHEADER;
  15:   

 

   1:  typedef struct tagBITMAPCOREHEADER {
   2:    DWORD bcSize;        // 헤더 크기(12bytes)
   3:    WORD  bcWidth;       // 이미지 폭(2Byte)
   4:    WORD  bcHeight;      // 이미지 높이(2Byte)
   5:    WORD  bcPlanes;      //  현재 지원 값은 1이다(2Byte)
   6:    WORD  bcBitCount;    // 비트수 1, 4 ,8, 24(2Byte)
   7:  } BITMAPCOREHEADER, 

 

Color Table(팔레트)

팔레트 인덱스에 의한 컬러값을 저장하기 위한 구조체이다 이 구조체를 사용하여 팔레트 수 만큼 배열을 할당하여 저장한다

256 컬러 모드의  영상은 팔레트 배열 크기가 256개, 컬러 영상은 파레트 크기가 2에16승 개이다

biClrUsed 변수를 참조하면 된다. 흑백영상의 경우 팔레트는 256 개이며, 트루컬러의 경우는 인덱스 저장이 아니라 데이터값을 직접 저장하므로 팔레트가 없다.

   1:  typedef struct tagRGBQUAD
   2:  {
   3:             BYTE          rgbBlue;          // B 성분 (파란색)(1Byte)
   4:             BYTE          rgbGreen;         // G 성분 (녹색)(1Byte)
   5:             BYTE          rgbRed;   // R 성분 (빨간색)(1Byte)
   6:             BYTE          rgbReserved1;     // 예약된 변수(1BbYte)
   7:  } RGBQUAD;

 

32비트 인 경우 아래와 같다

image

 

DIB  사용시 주의 점

실제로 비트맵 영상이 저장 될 때는 이미지가 거꾸로 저장되어 있다. 따라서 비트맵 영상 데이타를 나중에 영상처리를 위해 사용할 때 배열로 다시 저장할 때는 거꾸로 반전시켜 저장해주면 된다

   1:  for (i = 0; i< biHeight; i++) {
   2:       for (j = 0; j< biWidth; j++) {
   3:           GrayImg[ i * biWidth + j ] = lpMem[ ( biHeight - i - 1 ) * rwsize + j ]
   4:       }
   5:  }
   6:   

 

BMP 에서 읽어들인 영상버퍼 lpMem 에 있는 영상데이터를 나중에 사용할 임의의 배열 GrayImg 로 복사하는 코드이다. 이미지의 상하가 서로 반전되어 치환되고 있음을 알 수 있다. "rwsize"변수는 아래에서 설명한다.

영상 가로길이는 4바이트의 배수
비트맵은 메모리 저장시, 가로줄의 크기는 항상 4 바이트의 배수가 되어야 한다. 실제 사용하는 영상의 가로길이는 4 바이트의 배수가 아닐 수 있으므로 이럴 경우는 4 의 배수바이트로 바꾸어 저장한다.
예를 들어 지금 BMP 로 저장할 흑백영상 데이터의 실제 크기가 78 x 60 이라면 가로픽셀 78 은 78 byte 이고, 4 의 배수가 아니므로 80 바이트로 만들고 나머지 두 바이트는 아무 값이나 넣어준다. 실제 저장되는 메모리는 80 x 60 픽셀의 크기가 된다.
rwsize 변수는 BITMAPINFOHEADER 구조체의 biWidth 와 biBitCount 값을 사용하여 4 바이트의 배수로 만든다.

   1:  #define WIDTHBYTES(bits)    ((bits + 31) / 32 * 4)  // 4 바이트 배수로 변환
   2:  호출시: int rwsize = WIDTHBYTES(biBitCount * biWidth);

 

PiXel Data

   1:  typedef struct tagBITMAPINFO{ 
   2:     BITMAPINFOHEADER bmiHeader;
   3:     RGBQUAD   bmiColors[1];
   4:  } BITMAPINFO;

RGBQUAD 라는 색상구조체( color Table)에 미리 이 이미지에서 쓰인 모든 색을 정의한다. 고로 RGBQUAD라는 곳에는 총 256개 정도의 정보가 저장된다

PIXEL DATA라는 구조체에는 Color Table의 Index (몇번째로 선언된 색) 이라는 값만 가지고 있다.

 

BITMAP의 Type은 다음과 같이 7가지 정도로 나눌수 있겠다.

1Bit Bitmap : 2^0 으로 총 2가지의 색을 지닌다. 정말로 흑백이다.
2Bit Bitmap : 2^2 으로 총 4가지의 색을 지닌다. 아직도 흑백이다.
4Bit Bitmap : 2^4 으로 총 16가지의 색을 지닌다. 이제는 흑백TV수준이다.
8Bit Bitmap : 2^8 으로 총 256가지의 색을 지닌다. 적당한 크기와 적당한 칼라수를 가지고 있는관계로 임베디드 시스템처럼 크지않은 메모리에 자주 쓰인다. 기본이다.
16Bit Bitmap : 2^16으로 총 65,536가지의 색을 지닌다. 임베디드보다는 큰 메모리를 지니며, 256색으로는 도저히 안되겠다 싶을때 쓰는 색이다.
24Bit Bitmap : 2^24으로 총 16,777,216가지의 색을 지닌다. 하이컬러라고 부른다. 컬러TV정도는 되겠다.
32Bit Bitmap : 2^32으로 총 4,294,967,296가지의 색을 지닌다. 이것이 TRUE Color이다.

결과

버튼 이름 색상, 라디오 버튼 이름 색상 바꾸었습니다

image

728x90