文章出處

  本文主要介紹如何截取電腦桌面并將其保存為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;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 }

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()