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