2011-01-03 20 views
16

Voglio prendere uno screenshot usando python.Python windows 7 screenshot senza PIL

Ho provato a utilizzare PIL, ma dal momento che sto usando finestre a 64 bit e PIL python non funziona (ho potuto trovare solo le versioni PIL a 32 bit). A proposito, sto usando python 2.7.1.

Voglio prendere uno screenshot, non importa in che modo, purché possa richiedere più di 1 al secondo in velocità. Preferibilmente dovrebbe anche essere in grado di ritagliare l'area su cui è necessario uno screenshot, ma non è della massima importanza.

Il problema principale sembra essere in esecuzione su 64 bit e molte cose sembrano incompatibili con questo. Non voglio davvero tornare a 32 bit, se possibile. Ci sono programmi o moduli che possono farlo?

+1

Perché non usare 32 Python? –

risposta

30

Ottieni PIL per win-amd64-py2.7 a http://www.lfd.uci.edu/~gohlke/pythonlibs/#pil.

from PIL import ImageGrab 
im = ImageGrab.grab() 
im.save('screenshot.png') 

Aggiornamento: uso pywin32 (http://sourceforge.net/projects/pywin32/) invece di PIL di prendere screenshot di più schermi virtuali:

import win32gui, win32ui, win32con, win32api 
hwin = win32gui.GetDesktopWindow() 
width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN) 
height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN) 
left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN) 
top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN) 
hwindc = win32gui.GetWindowDC(hwin) 
srcdc = win32ui.CreateDCFromHandle(hwindc) 
memdc = srcdc.CreateCompatibleDC() 
bmp = win32ui.CreateBitmap() 
bmp.CreateCompatibleBitmap(srcdc, width, height) 
memdc.SelectObject(bmp) 
memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY) 
bmp.SaveBitmapFile(memdc, 'screenshot.bmp') 
+4

... se (come presumo dal nome) sei responsabile per il sito collegato, quindi Kudos! Stavo impazzendo cercando di compilare correttamente SciPy in 64-bit ;-) –

+0

Grazie! Quella versione PIL era esattamente quello che stavo cercando ma non riuscivo a trovare. Con win32gui, come intendi prendere schermate di più schermi virtuali? Quello che voglio fare è catturare ripetutamente uno screenshot di una parte del mio schermo, può farlo anche PIL o è meglio per pywin32? (E Pywin32 funziona con Python 64/Windows 7? Il nome è un po 'fuorviante :)) – Max

+0

ImageGrab.grab() accetta un argomento bbox facoltativo (http://www.pythonware.com/library/pil/handbook/imagegrab. htm). – cgohlke

1

Windows a 32 o 64 bit è irrilevante qui; è la "bit-ness" di Python e dei suoi moduli che contano. Se stai usando Python compilato a 32 bit, il PIL compilato a 32 bit funzionerà perfettamente su Windows a 64 bit.

D'altra parte, se si sta eseguendo Python compilato a 64 bit, è necessario trovare o creare una compilazione personalizzata di PIL compilata a 64 bit.

Edit:

È possibile scaricare una versione a 64 bit-compilata di PIL da http://www.lfd.uci.edu/~gohlke/pythonlibs/ - in particolare, si vuole PIL-1.1.7.win-amd64-py2.7.exe

+0

Ok, grazie! Questo è esattamente quello che stavo cercando ma non riuscivo a trovare. – Max