Python获取屏幕截图的几种方法
Python获取电脑截图有多种方式,具体如下:
PIL中的ImageGrab模块
windowsAPI
PyQt
pyautogui
使用Selenium截图PIL中的ImageGrab模块importtimeimportnumpyasnpfromPILimportImageGrabimgImageGrab。grab(bbox(100,161,1141,610))imgnp。array(img。getdata(),np。uint8)。reshape(img。size〔1〕,img。size〔0〕,3)python实现全屏截图:fromPILimportImageGrabimImageGrab。grab()可以添加一个坐标元组进去im。save(F:12。png)
使用PIL中的ImageGrab模块简单,但是效率有点低,截屏一次需0。5s。windowsAPI
调用windowsAPI,速度快但是使用较复杂,这里就不做详细介绍了,因为有更好用的PyQt。importtimeimportwin32gui,win32ui,win32con,win32apidefwindowcapture(filename):hwnd0窗口的编号,0号表示当前活跃窗口根据窗口句柄获取窗口的设备上下文DC(DiviceContext)hwndDCwin32gui。GetWindowDC(hwnd)根据窗口的DC获取mfcDCmfcDCwin32ui。CreateDCFromHandle(hwndDC)mfcDC创建可兼容的DCsaveDCmfcDC。CreateCompatibleDC()创建bigmap准备保存图片saveBitMapwin32ui。CreateBitmap()获取监控器信息MoniterDevwin32api。EnumDisplayMonitors(None,None)wMoniterDev〔0〕〔2〕〔2〕hMoniterDev〔0〕〔2〕〔3〕printw,h图片大小为bitmap开辟空间saveBitMap。CreateCompatibleBitmap(mfcDC,w,h)高度saveDC,将截图保存到saveBitmap中saveDC。SelectObject(saveBitMap)截取从左上角(0,0)长宽为(w,h)的图片saveDC。BitBlt((0,0),(w,h),mfcDC,(0,0),win32con。SRCCOPY)saveBitMap。SaveBitmapFile(saveDC,filename)begtime。time()foriinrange(10):windowcapture(haha。jpg)endtime。time()print(endbeg)PyQt
PyQt比调用windowsAPI简单很多,而且有windowsAPI的很多优势,比如速度快,可以指定获取的窗口,即使窗口被遮挡。需注意的是,窗口最小化时无法获取截图。
首先需要获取窗口的句柄。importwin32guihwndtitledict()defgetallhwnd(hwnd,mouse):ifwin32gui。IsWindow(hwnd)andwin32gui。IsWindowEnabled(hwnd)andwin32gui。IsWindowVisible(hwnd):hwndtitle。update({hwnd:win32gui。GetWindowText(hwnd)})win32gui。EnumWindows(getallhwnd,0)forh,tinhwndtitle。items():iftisnot:print(h,t)
程序会打印窗口的hwnd和title,有了title就可以进行截图了。fromPyQt5。QtWidgetsimportQApplicationfromPyQt5。QtGuiimportimportwin32guiimportsyshwndwin32gui。FindWindow(None,C:Windowssystem32cmd。exe)appQApplication(sys。argv)screenQApplication。primaryScreen()imgscreen。grabWindow(hwnd)。toImage()img。save(screenshot。jpg)pyautogui
pyautogui是比较简单的,但是不能指定获取程序的窗口,因此窗口也不能遮挡,不过可以指定截屏的位置,0。04s一张截图,比PyQt稍慢一点,但也很快了。importpyautoguiimportcv2imgpyautogui。screenshot(region〔0,0,100,100〕)x,y,w,himg。save(screenshot。png)imgcv2。cvtColor(np。asarray(img),cv2。COLORRGB2BGR)使用Selenium截图
使用Selenium只能进行WEB程序截图fromseleniumimportwebdriverimporttimedefcapture(url,filenamecapture。png):browserwebdriver。Chrome(rC:UsersweidiaoDesktopchromedriverwin32chromedriver。exe)browser。setwindowsize(1200,900)browser。get(url)Loadpagebrowser。executescript((function(){vary0;varstep100;window。scroll(0,0);functionf(){if(ydocument。body。scrollHeight){ystep;window。scroll(0,y);setTimeout(f,50);}else{window。scroll(0,0);document。titlescrolldone;}}setTimeout(f,1000);})();)foriinrange(30):ifscrolldoneinbrowser。title:breaktime。sleep(1)begtime。time()foriinrange(10):browser。savescreenshot(filename)endtime。time()print(endbeg)browser。close()capture(www。xx。net)