[VC + + 기술 잡담 006] 컴퓨터 데스크 톱 을 캡 처 하여 bmp 그림 으로 저장 합 니 다.

16120 단어 vc++
본 고 는 주로 컴퓨터 데스크 톱 을 캡 처 하여 bmp 그림 으로 저장 하 는 방법 을 소개 한다.
 
1. Bmp 이미지 파일 구성
Bmp 는 Windows 운영 체제 의 표준 이미지 파일 형식 입 니 다.
Bmp 이미지 파일 은 네 부분 으로 구성 되 어 있 습 니 다.
(1) 비트 맵 헤더 파일 데이터 구 조 는 Bmp 이미지 파일 의 유형, 파일 크기 등 정 보 를 포함 합 니 다.
(2) 비트 맵 정보 데이터 구 조 는 Bmp 이미지 의 너비, 높이, 압축 유형 등 정 보 를 포함한다.
(3) 색상 표, 이 부분 은 선택 할 수 있 고 비트 맵 이 필요 하 며 비트 맵 (예 를 들 어 24 비트 컬러 비트 맵) 이 필요 하지 않 습 니 다.
(4) 비트 맵 데이터.
1.1 비트 맵 헤더 파일 데이터 구조
비트 맵 헤더 파일 데이터 구 조 는 Bmp 이미지 파일 의 형식, 파일 크기 등 정 보 를 포함 하고 14 개의 바이트 를 차지한다.그 구조 정 의 는 다음 과 같다.
1 typedef struct tagBITMAPFILEHEADER {
2         WORD    bfType;                  //    (   BM)
3         DWORD   bfSize;                  //    
4         WORD    bfReserved1;              //     
5         WORD    bfReserved2;               //     
6         DWORD   bfOffBits;                 //         
7 } BITMAPFILEHEADER;

그 중에서 bfType 은 비트 맵 유형 을 나타 내 는데 반드시 BM 이 어야 한다.bfReserved 1 과 bfReserved 2 는 비트 맵 보존 글자 로 0 이 어야 합 니 다.bfOffBits 는 파일 헤드 의 편 이 량 을 표시 하고 비트 맵 데이터 의 시작 위치 도 표시 합 니 다.
1.2 비트 맵 정보 데이터 구조
비트 맵 정보 데이터 구 조 는 비트 맵 의 크기 등 정 보 를 설명 하 는 데 사용 되 며 40 개의 바이트 를 차지한다.그 구조 정 의 는 다음 과 같다.
 1 typedef struct tagBITMAPINFOHEADER{
 2         DWORD      biSize;                  //          
 3         LONG       biWidth;                   //    
 4         LONG       biHeight;                //    
 5         WORD       biPlanes;                //       
 6         WORD       biBitCount;               //         
 7         DWORD      biCompression;            //      (0   )
 8         DWORD      biSizeImage;             //    
 9         LONG       biXPelsPerMeter;          //       
10         LONG       biYPelsPerMeter;          //       
11         DWORD      biClrUsed;                //               
12         DWORD      biClrImportant;           //             
13 } BITMAPINFOHEADER;

그 중에서 biWidth 와 biHeight 는 비트 맵 의 너비 와 비트 맵 의 높이 를 나타 내 고 균일 한 픽 셀 을 단위 로 한다.biPlanes 는 팔레트 의 수량 을 1 로 표시 합 니 다.biBitCount 는 픽 셀 마다 필요 한 자릿수 를 표시 합 니 다. 그 값 은 1 (2 색), 4 (16 색), 8 (256 색), 16 (하 이 컬러) 또는 24 (리 얼 컬러) 여야 합 니 다.biCompression 은 비트 맵 압축 형식 을 표시 합 니 다. 그 값 은 0 (압축 하지 않 음), 1 (BI RLE 8 압축) 또는 2 (BI RLE 4 압축) 여야 합 니 다.
1.3 색 표
색상 표 는 비트 맵 의 색상 을 설명 하 는 데 사 용 됩 니 다. 몇 개의 표 항목 이 있 습 니 다. 각 표 항목 은 RGBQUAD 형식의 구조 체 로 색상 을 정의 합 니 다.RGBQUAD 구조 체 의 정 의 는 다음 과 같다.
1 typedef struct tagRGBQUAD {
2         BYTE    rgbBlue;                    //  
3         BYTE    rgbGreen;                   //  
4         BYTE    rgbRed;                     //  
5         BYTE    rgbReserved;                //   
6 } RGBQUAD;

색상 표 에 있 는 RGBQUAD 구조 데이터 의 개 수 는 biBitCount 에 의 해 정 해 집 니 다. biBitCount 가 1, 4, 8 일 때 각각 2, 16, 256 개의 표 항목 이 있 고 biBitCount 가 24 일 때 색상 표 항목 이 없습니다.
1.4 비트 맵 데이터
비트 맵 데 이 터 는 비트 맵 의 모든 픽 셀 값 을 기록 합 니 다. 기록 순 서 는 스 캔 줄 에서 왼쪽 에서 오른쪽으로, 스 캔 줄 사이 에서 아래 에서 위로 입 니 다.biBitCount 가 1 일 때 8 개의 픽 셀 이 1 개의 바이트 를 차지한다.biBitCount 가 4 일 때 2 개의 픽 셀 이 1 개의 바이트 를 차지한다.biBitCount 가 8 일 때 1 개의 픽 셀 이 1 개의 바이트 를 차지한다.biBitCount 가 24 일 때 1 개의 픽 셀 이 3 개의 바이트 (순서 B, G, R) 를 차지한다.
 
2. 프로 그래 밍 예시
컴퓨터 데스크 톱 을 캡 처 하고 bmp 그림 으로 저장 하 는 방법 을 보 여 줍 니 다.
 1 /*
 2  *      :                  bmp  
 3  *        : 
 4  *        :         
 5  */
 6 void CCopyScreenDlg:: CopyScreenToBitmap () 
 7 {
 8     //          
 9     CDC screenDC;
10     screenDC.CreateDC("DISPLAY", NULL, NULL, NULL);
11     
12     //        
13     CBitmap bmp;
14     int nWidth = GetSystemMetrics(SM_CXSCREEN);                    //    
15     int nHeight = GetSystemMetrics(SM_CYSCREEN);                  //    
16     bmp.CreateCompatibleBitmap(&screenDC, nWidth, nHeight);
17     
18     //          
19     CDC memDC;
20     memDC.CreateCompatibleDC(&screenDC);
21     memDC.SelectObject(&bmp);
22     memDC.BitBlt(0, 0, nWidth, nHeight, &screenDC, 0, 0, SRCCOPY);
23     
24     //      
25     BITMAP bm;
26     bmp.GetBitmap(&bm);
27     DWORD bmSize = bm.bmWidthBytes*bm.bmHeight;                    //      
28     LPSTR bmData = (LPSTR)GlobalAlloc(GPTR, bmSize);              //    
29 
30     //            
31     BITMAPFILEHEADER hdr;
32     hdr.bfType = (WORD)('M'<<8)|'B';                              //    (   BM)
33     hdr.bfSize = 54+bmSize;                                        //    
34     hdr.bfReserved1 = 0;                                          //     
35     hdr.bfReserved2 = 0;                                          //     
36     hdr.bfOffBits = 54;                                            //         
37 
38     //           
39     BITMAPINFOHEADER bmpInfoHdr;
40     bmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER);                 //          
41     bmpInfoHdr.biWidth = bm.bmWidth;                              //    
42     bmpInfoHdr.biHeight = bm.bmHeight;                            //    
43     bmpInfoHdr.biPlanes = bm.bmPlanes;                            //       
44     bmpInfoHdr.biBitCount = bm.bmBitsPixel;                        //         
45     bmpInfoHdr.biCompression = 0;                                 //      (0   )
46     bmpInfoHdr.biSizeImage = bmSize;                              //    
47     bmpInfoHdr.biXPelsPerMeter = 0;                                //       
48     bmpInfoHdr.biYPelsPerMeter = 0;                                //       
49     bmpInfoHdr.biClrUsed = 0;                                     //               
50     bmpInfoHdr.biClrImportant = 0;                                //             
51 
52     //      RGB       
53     GetDIBits(screenDC, bmp, 0, bmpInfoHdr.biHeight, bmData, (BITMAPINFO*)&bmpInfoHdr, DIB_RGB_COLORS);
54 
55     //  bmp  
56     CFile file;
57     if(file.Open("temp.bmp", CFile::modeCreate|CFile::modeWrite))
58     {
59         file.WriteHuge(&hdr, sizeof(BITMAPFILEHEADER));            //         
60         file.WriteHuge(&bmpInfoHdr, sizeof(BITMAPINFOHEADER));     //        
61         file.WriteHuge(bmData, bmSize);                            //      
62         file.Close();
63     }
64 }

좋은 웹페이지 즐겨찾기