2010-08-27 286 views
13

在windows上截取截图的最快方式是什么? PIL.ImageGrab相当慢..需要4-5秒才能截取同一个小窗口的30张截图。整个桌面的截图甚至更慢。在windows上用python截图的最快方法

+0

听起来像你真正想要的是屏幕视频,在Sourceforge上的一个CamStudio。什么是用例? – 2010-08-27 16:35:05

+7

获得有史以来的最高分[[漂亮的冬季]](P)[编辑] = P – Claudiu 2010-08-27 17:25:28

回答

23

您可以直接使用win32 API。

1)首先把焦点放在你想截图的应用上。 link text

2)Win32 API可以用截图帮助:

import win32gui 
import win32ui 
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()) 
+10

非常重要,因为这最近在屁股上咬我:你必须删除/释放由此创建的所有DC,或者在拍摄〜90张图像后,您将无法再使用。在这种情况下,'dcObj.DeleteDC(); cDC.DeleteDC(); win32gui.ReleaseDC(hwnd,wDC)' – Claudiu 2010-09-01 15:39:16

+0

请为此代码添加必要的导入工作。 – 2012-12-26 17:29:46

+0

请参阅此脚本以获取更多详细信息:http://bytes.com/topic/python/answers/576924-win32ui-vs-wxpy-screen-capture-multi-monitor – 2013-01-06 07:33:02

3

只是发现了如何用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倍。

+4

什么是get_rect? – denfromufa 2014-10-09 16:33:44