zoukankan      html  css  js  c++  java
  • 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=(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     else
    39         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 }
  • 相关阅读:
    洛谷 P1291 [SHOI2002]百事世界杯之旅 解题报告
    洛谷 P1338 末日的传说 解题报告
    洛谷 P3952 时间复杂度 解题报告
    vector-erase
    STL之--插入迭代器(back_inserter,inserter,front_inserter的区别
    STL之--插入迭代器(back_inserter,inserter,front_inserter的区别
    vector-end
    vector-end
    vector-empty
    vector-empty
  • 原文地址:https://www.cnblogs.com/mlj318/p/3806531.html
Copyright © 2011-2022 走看看