Python获取屏幕截图的四种方式
一. PIL中的Imagegeab模块(效率低,一次需要0.5秒)
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
)
二. windows API
调用Windows API ,速度快但是复杂
三. pyqt
比调用Windows API简单,而且速度快,可以指定获取的窗口,及时窗口被遮挡,但是窗口最小化就无法获得
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就可以进行截图了
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稍慢一点,但也很快了pyautogui是比较简单的,但是不能指定获取程序的窗口,因此窗口也不能遮挡,不过可以指定截屏的位置,0.04s一张截图,比PyQt稍慢一点,但也很快了
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)