비트맵 BMP 파일의 실제 BMP 파일의 BMP 파일을 화면에 개요 이해 분석 출력
} 비트맵 (bitmap) 윈도우즈에서영상을표현하기위해사용되는윈도우즈 GDI(Graphic Device Interface) 오브젝트의하나 } 벡터그래픽 (vector graphics) 점, 선, 면등의기본적인그리기도구를이용하여그림을그리는방식 } 윈도우즈 GDI(Graphic Device Interface) 윈도우즈에서화면및프린터출력을위해사용되는도구들 (pen, brush, bitmap, font, region, etc) 2
} 장치의존비트맵 (Device Dependent Bitmap) 출력장치 ( 화면, 프린터등 ) 의설정에따라출력이다르게나타나는형태 } 장치독립비트맵 (Device Independent Bitmap) 출력장치가달라지더라도항상정상적인형태로출력되는비트맵 BMP 파일은윈도우즈환경에서비트맵을 DIB 의형태로저장한파일포맷 3
} 일반적으로비트맵이란 픽셀값들을나타낸 2 차원어레이 4
} BMP 파일의전체구조 BITMAPFILEHEADER 비트맵파일에대한정보 BITMAPINFOHEADER 비트맵자체에대한정보 BMP 파일구조 RGBQUAD 배열 색상테이블 DIB 구조 color/index 배열 픽셀데이터 5
} BITMAPFILEHEADER 구조체 typedef struct tagbitmapfileheader { WORD bftype; DWORD bfsize; WORD bfreserved1; WORD bfreserved2; DWORD bfoffbits; } BITMAPFILEHEADER, *PBITMAPFILEHEADER; ( 참고 ) 여러가지영상파일포맷 BMP : 마이크로소프트윈도우즈기본영상포맷 ( 비압축 ) JPG : 주로 24비트포맷의트루컬러영상을손실압축형태로저장 GIF : 256 색상이하의영상을무손실압축 6
} BITMAP FILE HEADER Name Size Semantics Type 2 Byte BMP 파일임을나타내는태그. 0x42 0x4D (BM) for BMP BA: OS/2 Bitmap Array CI: OS/2 Color Icon CP: OS/2 Color Pointer IC: OS/2 Icon PT: OS/2 Pointer Size 4 Byte BMP 파일의크기 (in byte) Reserved 1 2 Byte 특정 application 등의용도를위하여비워놓은자리. 일반적으로 0 Reserved 2 2 Byte 특정 application 등의용도를위하여비워놓은자리. 일반적으로 0 Offset 4 Byte 실제픽셀정보 (bitmap data) 가시작되는위치 (in byte) 7
} 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 biclrimportant; } BITMAPINFOHEADER, *PBITMAPINFOHEADER; 8
} BITMAP INFO HEADER (DIB Header) Name Size Semantics Size 4 Byte The size of the header (in byte, default 40) Width 4 Byte Bitmap width in number of pixels Height 4 Byte Bitmap height in number of pixels Plane 2 Byte Number of color planes used. Always 1. BitCount 2 Byte Number of bits per pixel. (also color depth. 1, 4, 8, 16, 24, 32) Compression 4 Byte Compression Method used. 0 for no compression. ImageSize 4 Byte Image size for raw bitmap data in byte. XPelsPerMeter 4 Byte Horizontal resolution. Pixels per meter. YPelsPerMeter 4 Byte Vertical Resolution. Pixels per meter NumColors 4 Byte Number of colors in the palette. 0 이면 BitCount 에서지정한 color 수모두사용. 아닌경우는 RGBQUAD 구조체의크기를의미 NumImportant 4 Byte Number of important colors. 0 인경우모두색상이중요. 일반적으로 0 이며무시한다. 9
} Values for BITMAP INFO HEADER (DIB Header) Field Semantics Size 12: OS/2 V1 (OS/2, Win 3.0) 64: OS/2 V2 40: Win V3 (Win 3.0), default 108: Win V4 (Win 95/NT4) 128: Win V5 (Win 98/20) Compression 0: no compression. Most common. 1: Run length encoding for 8 bit/pixel 2: Run length encoding for 4 bit/pixel 3: Bit field. 16 or 32 bit/pixel 4: JPEG 5: PNG 10
} RGBQUAD 구조체의배열 typedef struct tagrgbquad { BYTE rgbblue; BYTE rgbgreen; BYTE rgbred; BYTE rgbreserved; } RGBQUAD; RGBQUAD 구조체의배열은트루컬러비트맵에서는존재하지않음 그레이스케일비트맵의경우, (0, 0, 0, 0)~(255, 255, 255, 0) 이차례대로저장됨 11
} 픽셀데이터 그레이스케일비트맵 : RGBQUAD 배열의인덱스저장 트루컬러비트맵 : (B, G, R) 순서로픽셀값저장 } 상하가뒤집힌상태로저장 (bottomup) 12
} Bitmap data 는 4 바이트단위로정렬 3 4 3 3 } Row_Size 4 é ColorDepth ê 32 PictureWidth ù ú 13
} 트루컬러 BMP 파일의분석 [B G R] = [ ] [ ] [ ] [80 80 80] 42 4D 66 36 28 04 04 01 18 30 13 0B 13 0B 80 80 80 80 80 80 80 80 80 80 80 80 14
} 그레이스케일 BMP 파일의분석 40 40 C0 40 40 C0 80 80 80 80 C0 C0 42 4D 46 04 36 04 28 04 04 01 08 10 23 0B 23 0B 01 01 01 01 01 02 02 02 03 03 03 04 04 04 05 05 05 06 06 FE C0 C0 C0 C0 40 40 80 80 40 40 80 80 15
} SetDIBitsToDevice 함수 int SetDIBitsToDevice( HDC hdc, int XDest, int YDest, DWORD dwwidth, DWORD dwheight, int XSrc, int YSrc, UINT ustartscan, UINT cscanlines, CONST VOID *lpvbits, CONST BITMAPINFO *lpbmi, UINT fucoloruse ); // 출력대상의 DC 핸들 // 출력대상의좌상귀 x 좌표 // 출력대상의좌상귀 y 좌표 // DIB 원본사각형너비 // DIB 원본사각형높이 // DIB 원본의좌상귀 x 좌표 // DIB 원본의좌상귀 y 좌표 // 첫번째스캔라인 // 출력할스캔라인의개수 // 픽셀데이터시작주소 // BITMAPINFOHEADER 시작주소 // RGB 또는팔레트인덱스 16
} StretchDIBits 함수 int StretchDIBits( HDC hdc, // 출력대상의 DC 핸들 int XDest, // 출력대상의좌상귀 x 좌표 int YDest, // 출력대상의좌상귀 y 좌표 int ndestwidth, // 출력대상의사각형너비 int ndestheight, // 출력대상의사각형높이 int XSrc, // DIB 원본의좌상귀 x 좌표 int YSrc, // DIB 원본의좌상귀 y 좌표 int nsrcwidth, / DIB 원본사각형너비 int nsrcheight, // DIB 원본사각형높이 CONST VOID *lpbits, // 픽셀데이터시작주소 CONST BITMAPINFO *lpbitsinfo, // BITMAPINFOHEADER 시작주소 UINT iusage, // RGB 또는팔레트인덱스 DWORD dwrop // 래스터연산코드 ); 17
} lenna.bmp 파일로부터 DIB 구조읽기 CFile file; BITMAPFILEHEADER bmfh; DWORD dwfilesize, dwdibsize; BYTE* pdib = NULL; file.open(_t("lenna.bmp"), CFile::modeRead CFile::shareDenyWrite, NULL); dwfilesize = (DWORD)file.GetLength(); dwdibsize = dwfilesize sizeof(bitmapfileheader); pdib = new BYTE[dwDibSize]; file.read(&bmfh, sizeof(bitmapfileheader)); file.read(pdib, dwdibsize); file.close(); 18
} 읽어들인 DIB 를화면에출력 BITMAPINFOHEADER* lpbmih = (BITMAPINFOHEADER*)pDib; int w = lpbmih>biwidth; int h = lpbmih>biheight; int c = lpbmih>bibitcount; // 비트맵정보시작위치를계산 BYTE* lpvbits; if( c == 24 ) lpvbits = (BYTE*)pDib + sizeof(bitmapinfoheader); else lpvbits = (BYTE*)pDib + sizeof(bitmapinfoheader) + sizeof(rgbquad)*(1<<c); CClientDC dc(this); ::SetDIBitsToDevice(dc.m_hDC, point.x, point.y, w, h, 0, 0, 0, h, lpvbits, (BITMAPINFO*)pDib, DIB_RGB_COLORS); delete [] pdib; // 동적할당한메모리를해제 19
} BmpShow 프로그램실행화면 20