admin管理员组

文章数量:1558908

本文转载自Python获取屏幕截图的4种方法-凌的博客 (jiuaitu)

 

 

Python获取电脑截图有多种方式,具体如下:

PIL中的ImageGrab模块

windows API

PyQt

pyautogui

 

PIL中的ImageGrab模块

 
import time

import numpy as np

from PIL import ImageGrab



img = ImageGrab.grab(bbox=(100, 161, 1141, 610))

img = np.array(img.getdata(), np.uint8).reshape(img.size[1], img.size[0], 3)

 

使用PIL中的ImageGrab模块简单,但是效率有点低,截屏一次需0.5s。

windows API

调用windows API,速度快但是使用较复杂,有更好用的PyQt。

 

python

  1. import time
    import win32gui, win32ui, win32con, win32api
    def window_capture(filename):
        hwnd = 0  # 窗口的编号,0号表示当前活跃窗口
        # 根据窗口句柄获取窗口的设备上下文DC(Divice Context)
        hwndDC = win32gui.GetWindowDC(hwnd)
        # 根据窗口的DC获取mfcDC
        mfcDC = win32ui.CreateDCFromHandle(hwndDC)
        # mfcDC创建可兼容的DC
        saveDC = mfcDC.CreateCompatibleDC()
        # 创建bigmap准备保存图片
        saveBitMap = win32ui.CreateBitmap()
        # 获取监控器信息
        MoniterDev = win32api.EnumDisplayMonitors(None, None)
        w = MoniterDev[0][2][2]
        h = MoniterDev[0][2][3]
        # print w,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)
    beg = time.time()
    for i in range(10):
        window_capture("haha.jpg")
    end = time.time()
    print(end - beg)

     

PyQt

PyQt比调用windows API简单很多,而且有windows API的很多优势,比如速度快,可以指定获取的窗口,即使窗口被遮挡。需注意的是,窗口最小化时无法获取截图。

首先需要获取窗口的句柄。

 

python

  1. import win32gui
    hwnd_title = dict()
    def get_all_hwnd(hwnd,mouse):
    if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
    hwnd_title.update({hwnd:win32gui.GetWindowText(hwnd)})
    
    win32gui.EnumWindows(get_all_hwnd, 0)
    for h,t in hwnd_title.items():
    if t is not "":
    print(h, t)

     

程序会打印窗口的hwnd和title,有了title就可以进行截图了。

 

python

  1. from PyQt5.QtWidgets import QApplication
    from PyQt5.QtGui import *
    import win32gui
    import sys
    
    hwnd = win32gui.FindWindow(None, 'C:\Windows\system32\cmd.exe')
    app = QApplication(sys.argv)
    screen = QApplication.primaryScreen()
    img = screen.grabWindow(hwnd).toImage()
    img.save("screenshot.jpg")

     

pyautogui

pyautogui是比较简单的,但是不能指定获取程序的窗口,因此窗口也不能遮挡,不过可以指定截屏的位置,0.04s一张截图,比PyQt稍慢一点,但也很快了。

 

python

  1. import pyautogui
    import cv2
    
    img = pyautogui.screenshot(region=[0,0,100,100]) # x,y,w,h
    # img.save('screenshot.png')
    img = cv2.cvtColor(np.asarray(img),cv2.COLOR_RGB2BGR)

     

本文标签: 种方法截图屏幕Python