2010-08-27 282 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