【VC++技術雜談006】截取電腦桌面並將其保存爲bmp圖片

  本文主要介紹如何截取電腦桌面並將其保存爲bmp圖片。編程

 

1. Bmp圖像文件組成數據結構

  Bmp是Windows操做系統中的標準圖像文件格式。函數

  Bmp圖像文件由四部分組成:spa

  (1)位圖頭文件數據結構,包含Bmp圖像文件的類型、文件大小等信息。操作系統

  (2)位圖信息數據結構,包含Bmp圖像的寬、高、壓縮類型等信息。code

  (3)顏色表,該部分可選,有些位圖須要,有些位圖(如24位真彩色位圖)不須要。對象

  (4)位圖數據。blog

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;bfReserved1和bfReserved2是位圖保留字,必須爲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(雙色)、4(16色)、8(256色)、16(高彩色)或24(真彩色);biCompression表示位圖壓縮類型,其值必須是0(不壓縮)、1(BI_RLE8壓縮)或2(BI_RLE4壓縮)。

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 }
相關文章
相關標籤/搜索