[转]python截图代码(Linux+Windows)


## inux环境下

可以参考这个示例:http://stackoverflow.com/questions/69645/take-a-screenshot-via-a-python-script-linux

这个是使用gtk库


*[python]
view plaincopyprint?


  1. import gtk.gdk
  2. w = gtk.gdk.get_default_root_window()
  3. sz = w.get_size()
  4. print “The size of the window is %d x %d” % sz
  5. pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,sz[0],sz[1])
  6. pb = pb.get_from_drawable(w,w.get_colormap(),0,0,0,0,sz[0],sz[1])
  7. if (pb != None):
  8. pb.save(“screenshot.png”,“png”)
  9. print “Screenshot saved to screenshot.png.”
  10. else:
  11. print “Unable to get the screenshot.”
  1. import sys
  2. from PyQt4.QtGui import QPixmap, QApplication
  3. app = QApplication(sys.argv)
  4. QPixmap.grabWindow(QApplication.desktop().winId()).save(‘test.png’, ‘png’)

Windows环境下



  1. import ImageGrab
  2. img = ImageGrab.grab()
  3. img.save(‘test.jpg’,‘JPEG’)


以上代码都是全屏截图的。下面介绍一下窗口截图的操作,暂时只有windows下的,linux的X11还要研究一下。

windows窗口有句柄的概念,通过句柄,我们可以知道这个句柄指向的窗口大小,位置等坐标信息。那么使用PIL中的ImageGrab库或Qt的QPixmap类都可以获取这个范围内的图像。前提是需要截图的部分在窗口最顶层,可以直接看到。

原理就是这些了,下面给一个示例,也是从网上找出来并修改的:

Qt版本:



  • # -- coding: cp936 --

  • import sys
  • import os
  • import ctypes
  • from PyQt4.QtGui import QPixmap, QApplication
  • #构造RECT结构体
  • class RECT(ctypes.Structure):
  • fields = [(‘left’, ctypes.c_long),
  • (‘top’, ctypes.c_long),
  • (‘right’, ctypes.c_long),
  • (‘bottom’, ctypes.c_long)]
  • def str(self):
  • return str((self.left, self.top, self.right, self.bottom))
  • app = QApplication(sys.argv)
  • HWND = ctypes.windll.user32.FindWindowA(None, “window title”)
  • if HWND == None:
  • print “找不到窗口”
  • quit()
  • QPixmap.grabWindow(HWND).save(‘c:/test.png’, ‘png’)


  • PIL版本:




  • # -- coding: cp936 --

  • import ctypes
  • import ImageGrab
  • #构造RECT结构体
  • class RECT(ctypes.Structure):
  • fields = [(‘left’, ctypes.c_long),
  • (‘top’, ctypes.c_long),
  • (‘right’, ctypes.c_long),
  • (‘bottom’, ctypes.c_long)]
  • def str(self):
  • return str((self.left, self.top, self.right, self.bottom))
  • HWND = ctypes.windll.user32.FindWindowA(None, “window title”)
  • print HWND
  • if HWND == 0:
  • print “找不到窗口”
  • quit()
  • rect =RECT()
  • ctypes.windll.user32.GetWindowRect(HWND,ctypes.byref(rect))
  • #去掉状态栏
  • rangle = (rect.left+2,rect.top+2,rect.right-2,rect.bottom-2)
  • im = ImageGrab.grab(rangle)
  • im.show()



  • 转自:http://blog.csdn.net/jt6562/article/details/6768153