首页 > 代码库 > windows截屏
windows截屏
1 #ifndef _CAPTURESCREEN_H 2 #define _CAPTURESCREEN_H 3 4 #include <windows.h> 5 class CaptureScreen 6 { 7 public: 8 CaptureScreen() 9 {};10 ~CaptureScreen(void)11 {};12 13 void ScreenInit();14 void ScreenFree();15 bool ScreenSetWindow(LPRECT lpRect); 16 bool ScreenCopy(BYTE *dstBuf); 17 18 int rHeight; //要获得的图像尺寸19 int rWidth;20 private: 21 int nScreenWidth;22 int nScreenHeight;23 PRGBTRIPLE scan0;24 BITMAPINFO pbi;25 int stride; 26 int top_x;27 int top_y;28 int bot_x;29 int bot_y;30 };31 32 #endif
1 #include "CaptureScreen.h" 2 3 void CaptureScreen::ScreenInit() 4 { 5 nScreenWidth = GetSystemMetrics(SM_CXSCREEN); 6 nScreenHeight = GetSystemMetrics(SM_CYSCREEN); 7 8 pbi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 9 pbi.bmiHeader.biWidth = nScreenWidth;10 pbi.bmiHeader.biHeight = nScreenHeight;11 pbi.bmiHeader.biPlanes = 1;12 pbi.bmiHeader.biBitCount = 24;13 pbi.bmiHeader.biCompression = BI_RGB;14 stride = ((nScreenWidth * 24 + 31) & 0xffffffe0) / 8; // 24位图像扫描线宽度15 scan0 = (PRGBTRIPLE)malloc(stride * nScreenHeight); // 图像数据缓冲区,应释放16 }17 18 void CaptureScreen::ScreenFree()19 {20 free(scan0); 21 }22 23 bool CaptureScreen::ScreenSetWindow(LPRECT lpRect)24 {25 top_x = lpRect->left;26 top_y = lpRect->top;27 bot_x = lpRect->right;28 bot_y = lpRect->bottom;29 if(top_x >= bot_x)30 return false;31 if(top_y >= bot_y)32 return false;33 if(top_x<0 || bot_x>nScreenWidth)34 return false;35 if(top_y<0 || bot_y>nScreenHeight)36 return false;37 38 rHeight = bot_y-top_y;39 rWidth = bot_x-top_x; 40 return true;41 }42 43 bool CaptureScreen::ScreenCopy(BYTE *dstBuf)44 { 45 HWND hDesktopWnd = GetDesktopWindow();46 HDC hDesktopDC = GetDC(hDesktopWnd);47 HDC hCaptureDC = CreateCompatibleDC(hDesktopDC);48 HBITMAP hCaptureBitmap =CreateCompatibleBitmap(hDesktopDC,nScreenWidth, nScreenHeight);49 SelectObject(hCaptureDC,hCaptureBitmap);50 BitBlt(hCaptureDC,0,0,nScreenWidth,nScreenHeight,hDesktopDC,0,0,SRCCOPY|NOMIRRORBITMAP);51 DeleteDC(hCaptureDC);52 53 GetDIBits(hDesktopDC, hCaptureBitmap, 0, nScreenHeight, scan0, &pbi, DIB_RGB_COLORS);54 ReleaseDC(hDesktopWnd,hDesktopDC);55 DeleteObject(hCaptureBitmap);56 57 BYTE *srcBuf = (BYTE*) scan0;58 59 int j;60 srcBuf += (nScreenHeight-1-top_y)*stride+top_x*3;// scan0倒序61 for(j=0;j<rHeight;j++)62 {63 memcpy(dstBuf,srcBuf,rWidth*3);64 dstBuf += rWidth*3;65 srcBuf -= stride;66 }67 return true;68 }
1 #include "CaptureScreen.h" 2 #include <stdio.h> 3 #include <Mmsystem.h> 4 #pragma comment( lib,"winmm.lib" ) 5 void SaveBmp2(BYTE *bgr32,int w,int h,int mode) 6 { 7 8 ///////////////////////////////////////////// 9 DWORD size=w*h*3;10 LPSTR lpData=http://www.mamicode.com/(LPSTR)GlobalAlloc(GPTR,size);11 /////////////////////////////////////////////12 BITMAPINFOHEADER bih;13 bih.biSize=sizeof(BITMAPINFOHEADER);14 bih.biWidth=w;15 bih.biHeight=h;16 bih.biPlanes=1;17 bih.biBitCount=24;18 bih.biCompression=0;19 bih.biSizeImage=w*h*3;//size;20 bih.biXPelsPerMeter=0;21 bih.biYPelsPerMeter=0;22 bih.biClrUsed=0;23 bih.biClrImportant=0;24 25 BITMAPFILEHEADER bfh;26 bfh.bfType=0x4D42; // "BM" // 设置位图文件头27 bfh.bfReserved1=bfh.bfReserved2=0;28 bfh.bfSize=54+size;29 bfh.bfOffBits=54;30 31 if(mode == 0)32 {33 for(int i=0;i<h;i++)34 {35 memcpy(lpData+(h-1-i)*w*3,bgr32+i*w*3,w*3);36 }37 }38 else39 memcpy(lpData,bgr32,w*h*3);40 41 static int filecount=0;42 char filename[255];43 sprintf(filename,"C:\\%d.bmp",filecount);44 FILE *fp=fopen(filename,"wb");45 46 if(fp)47 {48 49 fwrite(&bfh,1,sizeof(BITMAPFILEHEADER),fp);50 fwrite(&bih,1,sizeof(BITMAPINFOHEADER),fp);51 fwrite(lpData,1,size,fp);52 fclose(fp);53 filecount++;54 }55 GlobalFree(lpData);56 57 }58 59 int main()60 {61 62 CaptureScreen myCapture;63 myCapture.ScreenInit();64 RECT dstRect={0,0,1920,1080};65 myCapture.ScreenSetWindow(&dstRect);66 BYTE *dstBuff = (BYTE*)malloc(myCapture.rWidth*myCapture.rHeight*3);67 int lastTime = timeGetTime();68 myCapture.ScreenCopy(dstBuff);69 printf("time:%dms",timeGetTime()-lastTime);70 SaveBmp2((BYTE*)dstBuff,myCapture.rWidth,myCapture.rHeight,0);71 myCapture.ScreenFree();72 73 74 return 0;75 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。