Bitmap 구조

2010. 2. 12. 09:20언어/C++


원래의미인 Bitmap은 말 그대로 Bit의 모임이며 0과 1로 구성된 Data들의 집함을 말한다.
하지만 지금은 좁은 의미로 Image 데이터를 나타내는 말로 사용되고 있다.

Bitmap 의 종류

  • DDB(Device-Dependent Bitmap) -> 장치종속 Bitmap
  • DIB(Device-Independent Bitmap) -> 장치독립 Bitmap

DIB 구조

  • BITMAPFILEHEADER           -> File이 Bitmap File인지 구별하는 구조체.
  • BITMAPINFO                       -> Bitmap의 정보와 팔레트에 대한 정보를 제공하는 구조체.
    • BITMAPINFOHEADER  -> Bitmap의 정보에 관한 구조체.
    • RGBQUAD                   -> 이미지의 색상 정보 구조체.
  • Image Data                         -> 실제자료가 pixel 로 구성되어 있음.

DIB 구조체

type struct tagBITMAPFILEHEADER
{
    WORD        bfType;   // Bitmap파일을 나타내는 "BM" 문자의 ASCII값을 취함.
    DWORD      bfSize;   //  Bitmap파일의 크기
    WORD        bfReserved1;     // 사용하지 않은 확장 예약변수
    WORD        bfReserved2;     // 사용하지 않은 확장 예약변수
    DWORD      bfOffbits;  //BITMAPFILEHEADER에서부터 Image Data까지의 Byte수를 나타냄.
}BITMAPFILEHEADER;

type struct tabBITMAPINFO
{
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD                    bmicolors[1];
} BITMAPINFO;

type struct tagBITMAPINFOHEADER
{
    DWORD    biSize;
    LONG    biWidth;                 //이미지의 가로 길이.
    LONG    biHeight;                 //이미지의 세로 길이.
    WORD    biPlanes;
    WORD    biBitCount;                 //이미지의 컬러 비트수. 예) 8 이면 2의 8승이 되어 256컬러임을 알수 있음.
    DWORD    biCompression;
    DWORD    biSizeImage;
    LONG    biXPelsPerMeter;
    LONG    biYPelsPerMeter;
    DWORD    biClrUsed;
    DWORD    biClrImportant;
} BITMAPINFOHEADER;

typedef struct tagRGBQUAD
{
    BYTE    rgbblue;            
    BYTE    rgbGreen;
    BYTE    rgbRed;
    BYTE    rgbReserved;
} RGBQUAD;

이미지는 모든색을 사용하는 것이 아니라 특정 색만을 사용한다.
예를 들어 8비트 Bitmap 이미지는 256색만을 사용한다.
Bitmap 이미지의 color정보를 이미지를 로드할 때마다 시스템에서 얻어오는 것보다 Bitmap 파일 안에 color 정보를 가지고, 그곳에서 얻어오는 것이 속도면에서 많은 이득이 있기 때문에 RGBQUAD 구조체를 사용하여 Bitmap 이미지의 color 정보를 저장한다.

이러한 color정보들의 모임을 다른 말로 '팔레트(Palette)라고 한다.
8비트 Bitmap이미지에서는 256개 color에 해당하는 256개의 RGBQUAD 배열, 즉 이미지 파일내에 팔레트가 존재하게 된다.

여기서는 문제점이 있는데 만약 Bitmap 이미지가 16비트 이상의 color 이미지이면 문제가 발생한다. 16비트 Bitmap 이미지는 컬러 수가 65536색 이며, 이것을 Bitmap 파일 내에 팔레트를 둔다면 65536개의 RGBQUAD배열을 만들어야 한다.
이는 배보다 배꼽이 큰 경우가 되기 때문에 조금 느리더라도 16비트 이상의 Bitmap 이미지에서는 내부 팔레트를 사용하지 않고, 시스템에서 제공하는 시스템 팔레트를 사용한다.

이미지의 저장 상태

이미지를 보는 그림과는 다르게 Image Data에는 상하가 뒤집어진 상태로 저장되어 있다.
이 때문에 Surface에 이미지를 로들 할 때 주의를 해야 한다.

이미지를 저장하거나 로드할 때는 항상 width, 즉 가로길이를 4의 배수로 맞추어야 한다.
예를 들어 이미지가 30 * 30 크기의 이미지이면 한 줄 읽을 때는 32byte를 읽어야 한다.

Bitmap 이미지는 항상 가로길이가 4의 배수이기 때문에 30byte는 이미지 data이고 나머지 2byte는 길이를 맞추기 위해 채워져야 한다.
이것을 모르고 그냥 이미지를 물러모면 이미지가 화면에 제대로 출력되지 않는다.

'언어 > C++' 카테고리의 다른 글

분할검색 알고리즘  (0) 2010.09.08
Warning C4819  (0) 2010.03.05
C++ MFC DoModal 과 ShowWindow  (0) 2010.03.04
DLL 파일 생성 시.  (0) 2010.02.23
CString을 LPTSTR로  (0) 2010.02.12