利用win api 實現截圖 儲存為BMP並轉為位元組流
阿新 • • 發佈:2018-12-31
c++ 利用winAPI 實現截圖幕;
程式碼:
#include<windows.h> void ScreenSnap(HBITMAP hBitmap,char *bmpPath,HDC dc); int main() { HWND DeskWnd=::GetDesktopWindow();//獲取桌面視窗控制代碼 RECT DeskRC; ::GetClientRect(DeskWnd,&DeskRC);//獲取視窗大小 HDC DeskDC=GetDC(DeskWnd);//獲取視窗DC HBITMAP DeskBmp=::CreateCompatibleBitmap(DeskDC,DeskRC.right,DeskRC.bottom);//相容點陣圖 HDC memDC=::CreateCompatibleDC(DeskDC);//相容DC SelectObject(memDC,DeskBmp);//把相容點陣圖選入相容DC中 BitBlt(memDC,0,0,DeskRC.right,DeskRC.bottom,DeskDC,0,0,SRCCOPY);//拷貝DC ScreenSnap(DeskBmp,"d:\\Screen.bmp",DeskDC); return 0; } void ScreenSnap(HBITMAP hBitmap,char *bmpPath,HDC dc) { BITMAP bmInfo; DWORD bmDataSize; char *bmData;//點陣圖資料 GetObject(hBitmap,sizeof(BITMAP),&bmInfo);//根據點陣圖控制代碼,獲取點陣圖資訊 bmDataSize=bmInfo.bmWidthBytes*bmInfo.bmHeight;//計算點陣圖資料大小 bmData=new char[bmDataSize];//分配資料 BITMAPFILEHEADER bfh;//點陣圖檔案頭 bfh.bfType=0x4d42; bfh.bfSize=bmDataSize+54; bfh.bfReserved1=0; bfh.bfReserved2=0; bfh.bfOffBits=54; BITMAPINFOHEADER bih;//點陣圖資訊頭 bih.biSize=40; bih.biWidth=bmInfo.bmWidth; bih.biHeight=bmInfo.bmHeight; bih.biPlanes=1; bih.biBitCount=24; bih.biCompression=BI_RGB; bih.biSizeImage=bmDataSize; bih.biXPelsPerMeter=0; bih.biYPelsPerMeter=0; bih.biClrUsed=0; bih.biClrImportant=0; ::GetDIBits(dc,hBitmap,0,bmInfo.bmHeight,bmData,(BITMAPINFO *)&bih,DIB_RGB_COLORS);//獲取點陣圖資料部分 HANDLE hFile=CreateFile(bmpPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,0);//建立檔案 DWORD dwSize; WriteFile(hFile,(void *)&bfh,sizeof(BITMAPFILEHEADER),&dwSize,0);//寫入點陣圖檔案頭 WriteFile(hFile,(void *)&bih,sizeof(BITMAPINFOHEADER),&dwSize,0);//寫入點陣圖資訊頭 WriteFile(hFile,(void *)bmData,bmDataSize,&dwSize,0);//寫入點陣圖資料 ::CloseHandle(hFile);//關閉檔案控制代碼 }
實現某一區域截圖 並轉為位元組流:
int sumSize; char* getScreen(long left,long top,long right,long bottom){ HWND DeskWnd=::GetDesktopWindow();//獲取桌面視窗控制代碼 RECT DeskRC; DeskRC.left = left; DeskRC.top = top; DeskRC.right = right; DeskRC.bottom = bottom; // ::GetClientRect(DeskWnd,&DeskRC);//獲取視窗大小 HDC DeskDC=GetDC(DeskWnd);//獲取視窗DC HBITMAP DeskBmp=::CreateCompatibleBitmap(DeskDC,DeskRC.right-DeskRC.left,DeskRC.bottom-DeskRC.top);//相容點陣圖 HDC memDC=::CreateCompatibleDC(DeskDC);//相容DC SelectObject(memDC,DeskBmp);//把相容點陣圖選入相容DC中 BitBlt(memDC,0,0,right-DeskRC.left,DeskRC.bottom-DeskRC.top,DeskDC,DeskRC.left,DeskRC.top,SRCCOPY);//拷貝DC BITMAP bmInfo; DWORD bmDataSize; char *bmData;//點陣圖資料 GetObject(DeskBmp,sizeof(BITMAP),&bmInfo);//根據點陣圖控制代碼,獲取點陣圖資訊 bmDataSize=bmInfo.bmWidthBytes*bmInfo.bmHeight;//計算點陣圖資料大小 bmData=new char[bmDataSize];//分配資料 BITMAPFILEHEADER bfh;//點陣圖檔案頭 bfh.bfType=0x4d42; bfh.bfSize=bmDataSize+54; bfh.bfReserved1=0; bfh.bfReserved2=0; bfh.bfOffBits=54; BITMAPINFOHEADER bih;//點陣圖資訊頭 bih.biSize=40; bih.biWidth=bmInfo.bmWidth; bih.biHeight=bmInfo.bmHeight; bih.biPlanes=1; bih.biBitCount=24; bih.biCompression=BI_RGB; bih.biSizeImage=bmDataSize; bih.biXPelsPerMeter=0; bih.biYPelsPerMeter=0; bih.biClrUsed=0; bih.biClrImportant=0; ::GetDIBits(DeskDC,DeskBmp,0,bmInfo.bmHeight,bmData,(BITMAPINFO *)&bih,DIB_RGB_COLORS);//獲取點陣圖資料部分 sumSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmDataSize; char * stream = new char[sumSize]; memcpy(stream,&bfh,sizeof(BITMAPFILEHEADER)); memcpy(stream+sizeof(BITMAPFILEHEADER),&bih,sizeof(BITMAPINFOHEADER)); memcpy(stream+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER),bmData,bmDataSize); HANDLE hFile=CreateFile("d:\\Screen.bmp",GENERIC_WRITE,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,0);//建立檔案 DWORD dwSize; WriteFile(hFile,(void *)stream,sumSize,&dwSize,0);//寫入點陣圖檔案頭 ::CloseHandle(hFile);//關閉檔案控制代碼 return stream; }