在Windows上快速截屏的最快方法是什么?PIL.ImageGrab
相对较慢...它需要4-5秒钟才能截取同一个小窗口的30个截图。截取整个桌面的截图甚至更慢。
在Windows上快速截屏的最快方法是什么?PIL.ImageGrab
相对较慢...它需要4-5秒钟才能截取同一个小窗口的30个截图。截取整个桌面的截图甚至更慢。
你可以直接使用win32 API进行操作。
import win32gui
import win32ui
import win32con
w = 1920 # set this
h = 1080 # set this
bmpfilenamename = "out.bmp" #set this
hwnd = win32gui.FindWindow(None, windowname)
wDC = win32gui.GetWindowDC(hwnd)
dcObj=win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0,0),(w, h) , dcObj, (0,0), win32con.SRCCOPY)
dataBitMap.SaveBitmapFile(cDC, bmpfilenamename)
# Free Resources
dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())
dcObj.DeleteDC(); cDC.DeleteDC(); win32gui.ReleaseDC(hwnd, wDC)
进行删除/释放。 - Claudiuwin32gui.DeleteObject(dataBitMap.GetHandle())
也是必要的。我已经编辑了答案,包括这两个评论。 - jedwardswindowname
在哪里被定义了或者它应该是什么? - HendydcObj = win32ui.CreateDCFromHandle(wDC)
我无法访问该对象的函数,因此 dcObj.CreateCompatibleDC()
不起作用
(我使用VSCode,通常在键入对象后的点时会给出建议,但是在这里它没有这样做,所以我认为我需要导入其他东西?我在我的虚拟环境中安装了pywin32,并在程序中导入了 win32gui、win32ui、win32con
。有人有想法吗? - xvk刚找到了如何使用gtk实现。看起来这是迄今为止最快的方法:
def image_grab_gtk(window):
left, top, right, bot = get_rect(window)
w = right - left
h = bot - top
s = gtk.gdk.Pixbuf(
gtk.gdk.COLORSPACE_RGB, False, 8, w, h)
s.get_from_drawable(
gtk.gdk.get_default_root_window(),
gtk.gdk.colormap_get_system(),
left, top, 0, 0, w, h )
final = Image.frombuffer(
"RGB",
(w, h),
s.get_pixels(),
"raw",
"RGB",
s.get_rowstride(), 1)
return final
在不将其转换为 PIL
图像的情况下,它比我的测试用例中的 PIL 快8倍。即使进行转换,它仍然快约2.7倍。
import dxcam
camera = dxcam.create()
frame = camera.grab() # full screen
frame = camera.grab(region=(left, top, right, bottom)) # region
屏幕截图:
camera.start(target_fps=60) # threaded
for i in range(1000):
image = camera.get_latest_frame() # Will block until new frame available
camera.stop()
DXcam | python-mss | D3DShot | |
---|---|---|---|
平均FPS | 238.79 | 75.87 | 118.36 |
标准差 | 1.25 | 0.5447 | 0.3224 |
import mss
with mss.mss() as sct:
filename = sct.shot(output="output.png")
import mss
import numpy as np
with mss.mss() as sct:
monitor = {"top": 160, "left": 160, "width": 160, "height": 135}
img_array = np.array(sct.grab(monitor))
# Do whatever you want...