2013년 5월 5일 일요일

비트맵의 종류(DDB, DIB)


윈도우즈가 지원하는 비트맵 포맷 두 가지
1. DDB(Device Dependent Bitmap)
2. DIB(Device Independent Bitmap)

DDB의 특징
1. 윈도우즈 3.0 이전 버전에서 사용
2. 출력 장치에 의존족
3. 이미지의 크기, 색상 등 기본적인 정보와 이미지 데이터로 구성
4. 2번과 같은 이유로 다양한 해상도의 장치에 광범위하게 사용되지 못함(예를 들면 256색으로 만들어진 DDB는 다른 장치나 다른 화면 모드에서 색상을
제대로 표현하지 못한다. 쉽게 말해 흑백 비트맵은 흑백 장치로만 출력할 수 있고 컬러 비트맵은 컬러 장치에만 출력할 수 있다.)

DIB의 특징
1. 윈도우즈 3.0버전부터 지원
2. 출력 장치에 독립적
3. DDB에 비해 색상 테이블, 해상도 정보 등의 추가 정보를 가지므로 장치에 종속되지 않음
4. 2번과 같인 이유로 활용도가 훨씬 더 광범위하고 화환성이 뛰어나다.(DIB  포맷은 컬리 비트맵을 흑백 프린터로 출력할 수도 있고 색상 수가 조금 틀린 장치로도 출력할 수 있다.)

DDB보다 DIB의 사용이 훨씬 더 유리하지만 버릴 수는 없다.
그 이유는 다음과 같다.
1. 하위 호환성을 위해 Win32는 여전히 DDB를 지원한다.
2. DC에 선택될 수 있는 비트맵은 DDB뿐이다.(DC의 색상 포맷이 고정되어 있으므로 DIB는 직접 DC에 선택될 수 없으며 일단 DDB로 변환해야 출력할 수 있다.)
3. 프로그램 내부에서 만들어지고 파괴되는 비트맵은 DDB가 훨씬 더 효율적이다.(DIB는 많은 기능을 가지고 있지만 그만큼 복잡하기 때문에 내부적이고 임시적인 사용에는 적합하지 않다.)

그러므로 DIB는 물론 DDB도 같이 알아야 하며 두 포맷의 차이점과 상호 변환방법에 대해서도 잘 알고 있어야 한다.

DDB의 구조
Win32에서 HBITMAP으로 지칭되는 비트맵 오브젝트는 DDB를 말하며 DDB만이 DC에 선택될 수 있다.
비록 리소스 에디터에 의해 만들어지는 비트맵 리소스들은 모두 DIB이지만 이 리소스는 LoadBitmap 함수에 의해 읽혀지면서 현재 비디오 모드와
호환되는 DDB로 변경된다.
DDB포맷은 다음과 같은 구조체 하나로 표현된다.

typedef strcut tagBITMAP{//bm
     LONG bmType;
     LONG bmWidth;
     LONG bmHeight;
     LONG bmWidthBytes;
     WORD bmPlanes;
     WORD bmBitsPixel;
     LPVOID bmBits;
}BITMAP;

LONG bmType : 비트맵의 타입을 지정하되 0으로 고정
LONG bmWidth : 비트맵의 폭
LONG bmHeight : 비태맵의 높이
LONG bmWidthBytes : 한 줄(Scan line)의 바이트 수,반드시 짝수
WORD bmPlanes : 색상면의 수
WORD bmBitsPixel : 한 픽셀을 표현하기 위해 필요한 바이트 수,1이면 흑백, 4면 16색, 8이면 256색,24면 트루컬러 비트맵
LPVOID bmBits : 비트맵의 실제 데이터, 즉 비트맵의 이미지 모양을 가지는 래스터 데이터(Raster Data)에 대한 포인터

래스터 데이터란?
http://terms.naver.com/entry.nhn?cid=912&docId=784230&categoryId=912


DDB의 생성
DDB 비트맵을 만드는 기본적인 함수는 두 가지
HBITMAP CreateBitmap( int nWidth, int nHeight, UINT cPlanes, UINT cBitsPerPel, CONST VOID* lpvBits );
HBITMAP CreateBitmapIndirect( CONST BITMAP*lpbm );
인수를 취하는 방식만 다를 뿐 근본적으로 같은 함수라 할 수 있다.

CreateBitmap 함수로 컬러 비트맵을 만드는 것도 가능하지만 컬러 비트맵은 흑백보다 비트맵 데이터가 복잡하여 수작업으로
만들기가 어렵다. 또 컬러 비트맵은 반드시 현재 화면의 색상 포맷과 호환되어야만 출력할 수 있으므로 임의의 색상수로 비트맵을
만들어서는 안되며 반드시 GetDeviceCaps 함수로 색상면의 수와 픽셀당 비트수를 조사하여 호환 비트맵을 만들어야 한다.
이 작업을 대신하는 함수가 바로 다음 함수이다.

HBITMAP CreateCompatibleBitmap( HDC hdc, int nWidth, int nHeight );
이 함수는 hdc와 호환되는 포맷의 비트맵을 nWidth, nHeight 크기로 만든다. 여기서 "호환된다"는 말은 색상 포맷이 같다는
뜻이며 더 정확하게 표현하자면 색상면과 픽셀당 비트수가 같다는 뜻이다.
즉 화면이 256모드면 비트맵도 256비트맵이 되고 트루 컬러 화면이면 비트맵도 트루 컬러로 만들어 진다는 뜻이다.
이 함수는 비트맵을 만들기만 하며 래스터 데이터는 초기화하지 않으므로 내부 표면에 그림은 아직 없다.



DIB의 구조
DIB는 다양한 장치에 사용하기 위해 비트맵 출력에 대한 상세 정보를 포함하고 있다.
고수준 라이브러리를 쓸 계획이라면 몰라도 상관 없으나 비트맵을 제대로 활용해 보고 그래픽 파일의 구조에
대해 깊이 있게 탐구해 보고 싶다면 DIB의 구조를 익혀야 한다.

BITMAPFILEHEADER 구조체
DIB 파일의 제일 선두에 있는 구조체이며 비트맵 파일 자체에 관한 정보를 가진다.
typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER;

bfType : 파일의 형태를 지정하는 매직 넘버이며 반드시 BM이어야 한다.(0x42, 0x4d)
bfSize : 비트맵 파일의 크기를 바이트 단위로 지정한다.
bfReserved1 : 예약. 0으로 설정한다. 비트맵도 커서와 마찬가지로 핫 스팟을 가질 수 있는데 예약 멤버는 핫스팟 저장용으로 설계되었으나 실제로는 사용되지 않는다.
같은 포맷으로 커서도 저장하는데 이 때는 다음 멤버와 함께 핫스팟을 지정하는 용도로 사용된다.
bfReserved2 : 예약. 0으로 설정한다.
bfOffBits : 이 구조체와 실제 비트맵 데이터와 오프셋 값을 가진다. 이 값은 BITMAPFILEHEADER의 크기 + BITMAPFILEHEADER의 크기 + RGBQUAD 구조체 배열의 크기이다.

이 구조체는 DIB가 디스크의 파일로 저장될 때만 사용되며 비트맵을 출력할 때는 사용되지 않는다.
즉 파일로 저장된 BMP파일에만 이 구조체가 있고 메모리상의 DIB에는 이 구조체가 없다.

BITMAPINFOHEADER 구조체
이 구조체 BITMAPFILEHEADER 구조체 바로 뒤에 위치한다.
 DIB의 크기( 가로 폭, 세로 높이)와 색상 포맷에 관한 정보, 그리고 기타 장치 독립성을 보장하는 몇 가지 정보들을 가지는 구조체이다.
typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;
        LONG       biWidth;
        LONG       biHeight;
        WORD       biPlanes;
        WORD       biBitCount;
        DWORD      biCompression;
        DWORD      biSizeImage;
        LONG       biXPelsPerMeter;
        LONG       biYPelsPerMeter;
        DWORD      biClrUsed;
        DWORD      biClrImportant;
} BITMAPINFOHEADER;


...정리중

위 내용은 모두 '윈도우즈 API 정복 2권' 의 내용을 요약한것입니다.

댓글 없음:

댓글 쓰기