標籤:
參考:http://bbs.csdn.net/topics/330154355
#include "stdio.h"#include "windows.h"/************************************************************************//* hBitmap 為剛才的螢幕位元影像控制代碼 /* lpFileName 為須要儲存的位元影像檔案名稱/************************************************************************/int SaveBitmapToFile(HBITMAP hBitmap,LPSTR lpFileName) { HDC hDC; //裝置描寫敘述表 int iBits;//當前顯示解析度下每一個像素所佔位元組數 WORD wBitCount;//位元影像中每一個像素所佔位元組數 DWORD dwPaletteSize=0;//定義調色盤大小 DWORD dwBmBitsSize;//位元影像中像素位元組大小 DWORD dwDIBSize;// 位元影像檔案大小 DWORD dwWritten;//寫入檔案位元組數 BITMAP Bitmap;//位元影像結構 BITMAPFILEHEADER bmfHdr; //位元影像屬性結構 BITMAPINFOHEADER bi; //位元影像檔案頭結構 LPBITMAPINFOHEADER lpbi; //位元影像資訊頭結構 指向位元影像資訊頭結構 HANDLE fh;//定義檔案控制代碼 HANDLE hDib;//分配記憶體控制代碼 HANDLE hPal;//分配記憶體控制代碼 HANDLE hOldPal=NULL;//調色盤控制代碼 //計算位元影像檔案每一個像素所佔位元組數 hDC = CreateDC("DISPLAY",NULL,NULL,NULL); iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); DeleteDC(hDC); if (iBits <= 1) wBitCount = 1; else if (iBits <= 4) wBitCount = 4; else if (iBits <= 8) wBitCount = 8; else if (iBits <= 24) wBitCount = 24; else if (iBits<=32) wBitCount = 24; //計算調色盤大小 if (wBitCount <= 8) dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD); //設定位元影像資訊頭結構 GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = Bitmap.bmWidth; bi.biHeight = Bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wBitCount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)* 4*Bitmap.bmHeight ; //為位元影像內容分配記憶體 hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); if (lpbi==NULL) { return 0; } *lpbi = bi; // 處理調色盤 hPal = GetStockObject(DEFAULT_PALETTE); if (hPal) { hDC = GetDC(NULL); hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); RealizePalette(hDC); } // 擷取該調色盤下新的像素值 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize, (LPBITMAPINFO)lpbi, DIB_RGB_COLORS); //恢複調色盤 if (hOldPal) { SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ReleaseDC(NULL, hDC); } //建立位元影像檔案 fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE; // 設定位元影像檔案頭 bmfHdr.bfType = 0x4D42; // "BM" dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwPaletteSize + dwBmBitsSize; bmfHdr.bfSize = dwDIBSize; bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize; // 寫入位元影像檔案頭 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // 寫入位元影像檔案其餘內容 WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); //清除 GlobalUnlock(hDib); GlobalFree(hDib); CloseHandle(fh); return 1;} HBITMAP GetCaptureBmp() { HDC hDC; HDC MemDC; BYTE* Data; HBITMAP hBmp; BITMAPINFO bi; memset(&bi, 0, sizeof(bi)); bi.bmiHeader.biSize = sizeof(BITMAPINFO); bi.bmiHeader.biWidth = GetSystemMetrics(SM_CXSCREEN); bi.bmiHeader.biHeight = GetSystemMetrics(SM_CYSCREEN); bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 24; hDC = GetDC(NULL); MemDC = CreateCompatibleDC(hDC); hBmp = CreateDIBSection(MemDC, &bi, DIB_RGB_COLORS, (void**)&Data, NULL, 0); SelectObject(MemDC, hBmp); BitBlt(MemDC, 0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight,hDC, 0, 0, SRCCOPY); ReleaseDC(NULL, hDC); DeleteDC(MemDC); return hBmp; } void main(){ HBITMAP hBmp; hBmp = GetCaptureBmp(); SaveBitmapToFile(hBmp,"c:\\11.bmp"); }
windows API 實現