비트맵,DDB,DIB
Programming/API 2015. 6. 21. 22:51비트맵(BitMap)
- 이미지를 저장하고 있는 그래픽 오브젝트이다.
미리 그려진 그림의 각 픽셀 색상, 기타 이미지의 크기, 해상도등의 정보를 가지고 있는
이미지 데이터의 덩어리라고 할 수 있다.
비트맵은 미리 그려져 있는 그림을 단순히 복사하는 것이기 때문에 출력 속도도 매우 빠르다.
하지만 데이터 양이 많기 때문에 메모리를 많이 소모한다는 단점도 있다.
비트맵의 용도
- 윈도우즈에서는 비트맵은 여러 가지 용도로 사용된다.
화려한 인터페이스를 디자인하고자 할 때, 프로그램 내부적인 화면 처리에도 종종 사용된다.
브러시나 커스텀 컨트롤을 만들때도 필요하다.
윈도우즈가 지원하는 비트맵 포맷은 DDB와 DIB가 있다.
DDB( Device Dependent Bitmap)
(장치에 종속적인 비트맵 이미지)
- GDI에서는 DC와 연결되는 Bitmap을 DDB라고 한다.
GDI에서 비트맵 출력을 위해서는 DDB가 필요하며 장치(DC)에 종속되는 비트맵으로
색상, 크기 등의 이미지 정보가 DC를 따라가며 DC와 호환이 되어야만이 정상적으로 그림이 출력이 된다.
- 출력 장치에 많이 의존되며 몇 가지 제한이 있다.
DDB는 이미지의 크기와 색상에 관한 기본적인 정보와 이미지 데이터만으로 구성되어 있기
때문에 다양한 해상도의 장치에 광범위하게 사용되지 못한다.
또한 만들어진 장치 외의 다른 장치에서 제대로 출력되지 못하는 경우가 있다.
ex) 256색으로 만들어진 DDB는 다른 장치나 다른 화면 모드에서 색상을 제대로 출력하지 못한다. 흑백 비트맵은 흑백 장치로만 출력할 수 있다는 말이다.
CreateCompatibleBitmap, CreateBitmap 등의 함수를 사용하여 만들어진 HBITMAP 객체들이
DDB이고, GDI를 통해서 화면(DC)에 출력된 이미지는 DDB라고 보아도 된다.
DIB(Device Independent Bitmap)
(장치에 종속되지 않은 독립적인 비트맵)
- DIB에서 대표적으로 BMP파일이 있다.
이 BMP파일에는 그림에 대한 모든 정보(사이즈, 색상, 팔레트 등)이 들어있다.
많은 정보가 들어있어서 BMP파일 자체만으로도 이미지를 출력할 수 있다.
다시말해서 BMP 파일 하나만으로 그림을 정삭적으로 출력할 수 있는 정보를 가지고 있는 것이다.
- 장치에 독립적이기 때문에 어디에서나 제 모양대로 출력될 수 있다.
DIB는 DDB에 비해서 색상 테이블과 해상도 정보 등의 추가 정보를 가지므로 장치에 종속되지 않으며, 활용 용도가 더 광범위하고 호환성이 뛰어나다.
이미지를 파일로 저장하기 위해서는 독립적인 DIB로 저장이 되어야 하며, 이를 윈도우에서 GDI를 통해서 화면에 출력 하려면 DDB로 변환을 해야한다.
DIB(BMP)의 구조
BITMAPFILEHEADER의 구조체
typedef struct tagBITMAPFILEHEADER
{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bf0ffBits;
}BITMAPFILEHEADER;
bfType : BM글자(0x42,0x4D)
bfSize : 파일의 전체 크기
bfReserved1 : 사용하지 않는다.
bfReserved2 : 사용하지 않음
bf0ffBits : 이미지가 시작되는 Offset 위치
BMP 파일의 최상단은 위와 같은 파일정보가 들어간다.
이는 DIB정보가 아닌 BMP 파일 자체의 정보로 DIB 구조에서는 필요하지 않는 정보이다.
BMP 파일을 오픈하여 가장 먼저 BITMAPFILEHEADER를 읽어들어야한다.
그리고 bfType값을 비교해서 BM값이 맞는지 확인한다.
가장 앞에 BM이 없다면 이는 BMP파일이 아닌 것으로 판단할 수 있다.
BITMAPINFOHEADER의 구조체
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrlmportant;
}BITMAPINFOHEADER;
biSize : 본 구조체의 크기
biWidth : 픽셀 너비( 바이트 길이가 아닌 픽셀 )
biHeight : 픽셀높이
biPlanes : 무조건 1
biBitCount : 색상 깊이 ( 8 : 256, 16 : 65536, 24, 32 )
biCompression : 압축 방식 BI_RGB(0) 비트맵은 압축을 하지않는 것이 기본
biSizeImage : 이미지 크기 무압축의 경우 사용되지 않는다.
biXPelsPerMeter : 디바이스 미터당 픽셀 수 (무시)
biYPelsPerMeter : 디바이스 미터당 픽셀 수 (무시)
biClrUsed : 실제 사용 색상 수, 0이면 올칼라
biClrlmportant : 주로 사용된 색상 수 0이면 올칼라
BITMAPINFOHEADER 정보를 읽어서 BMP 파일의 정보를 확인 할 수 있다.
이 데이터부터 DIB의 자료이다.
struct RGBQUAD
- 비트맵에서 사용되는 색상 테이블
typedef struct tagRGBQUAD
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
}RGBQUAD;
8bit Color의 경우에 팔레트 데이터를 사용한다.
RGBQUAD의 값이 팔레트 데이터이며, 256 color이면 RGBQUAD 데이터가 256개 존재한다.
( 8bit color는 거의 사용하지 않으므로 생략 한다.)
BITMAPINFOHEADER와 RGBQUAD의 구조체는 BITMAPINFO라는 구조체 하나로 관리된다.
BITMAPINFO
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColor[1];
}BITMAPINFO;
픽셀 이미지 데이터
이제 이미지의 크기만큼 픽셀 데이터가 들어있다.
DIB의 특징
1. 이미지가 뒤집혀서 들어있다.
2. 줄단위로 4Byte정렬이 되어있다.
DIB를 DC에 출력하는 함수는 StretchDIBits() 함수또는 SetDIBitsToDevice() 함수이다.
**
1. 하위 호환성을 위해서 Win32는 여전히 DDB를 지원한다.
최근까지도 DDB는 많이 사용되고 있기때문에 MS에서는 이 포맷을 계속 지원할 것
2. DC에 선택될 수 있는 비트맵은 DDB뿐이다.
DC의 색상 포맷이 고정되어 있으므로 DIB는 직접 DC에 선택될 수 없으며 일단은 DDB로
변환해야 출력이 가능하다.
3. 프로그램 내부에서 만들어지고 파괴되는 비트맵은 DDB가 더 효율적이다.
DIB는 많은 기능을 가지고 있지만 복잡하기 때문에 내부적이고 임시적인 사용에는 적합하지
않다.
출처 : 윈도우즈 API 정복
'Programming > API' 카테고리의 다른 글
CreateFile, ReadFile, WriteFile (0) | 2015.06.22 |
---|---|
DDB의 구조,출력 (0) | 2015.06.22 |
SendMessage (0) | 2015.06.16 |
CALLBACK TimerProc (0) | 2015.06.10 |
CALLBACK함수 (0) | 2015.06.10 |