使用Python在Windows上获取屏幕截图?

时间:2010-05-17 06:04:17

标签: python windows screenshot

我正在创建Beta测试人员报告模块,以便他们可以发送我的软件评论,但我希望可以选择在报告中包含屏幕截图。如何在Windows上使用Python截取屏幕截图?我在Linux上找到了几个例子,但在Windows上没有太多运气。

9 个答案:

答案 0 :(得分:24)

值得注意的是ImageGrab仅适用于MSWindows。

对于跨平台兼容性,一个人最好使用wxPython库。 http://wiki.wxpython.org/WorkingWithImages#A_Flexible_Screen_Capture_App

import wx
wx.App()  # Need to create an App instance before doing anything
screen = wx.ScreenDC()
size = screen.GetSize()
bmp = wx.EmptyBitmap(size[0], size[1])
mem = wx.MemoryDC(bmp)
mem.Blit(0, 0, size[0], size[1], screen, 0, 0)
del mem  # Release bitmap
bmp.SaveFile('screenshot.png', wx.BITMAP_TYPE_PNG)

答案 1 :(得分:10)

另一种非常快的方法是MSS模块。它与其他解决方案的区别在于它仅使用ctypes标准模块,因此它不需要很大的依赖性。它是独立于操作系统的,它的使用变得简单:

from mss import mss

with mss() as sct:
    sct.shot()

然后找到包含第一台显示器屏幕截图的screenshot.png文件。有很多可能的自定义,你可以使用ScreenShot个对象和OpenCV / Numpy / PIL /等。

答案 2 :(得分:9)

可以使用PIL完成此操作。首先,安装它,然后你可以采取这样的完整截图:

import PIL.ImageGrab

im = PIL.ImageGrab.grab()     
im.show()   

答案 3 :(得分:4)

您可以使用ImageGrab模块。 ImageGrab适用于Windows和macOS,您需要PIL(Pillow)才能使用它。这是一个小例子:

from PIL import ImageGrab
snapshot = ImageGrab.grab()
save_path = "C:\\Users\\YourUser\\Desktop\\MySnapshot.jpg"
snapshot.save(save_path)

答案 4 :(得分:4)

对于pyautogui用户:

import pyautogui
screenshot = pyautogui.screenshot()

答案 5 :(得分:3)

截取屏幕截图的简单方法是通过Pygame。

 pygame.image.save(Surface, filename)

“Surface”是表格的截图,“filename”是保存图像的文件路径,名称和类型。

您可以导出为BMP,TGA,PNG或JPEG。从Pygame 1.8开始,PNG和JPEG也可以使用。

如果未指定文件扩展名,则默认为.TGA文件。

您甚至可以使用'os'库保存到特定的文件目录。

一个例子:

import os
import pygame
surface = pygame.display.set_mode((100, 100), 0, 32)
surface.fill((255, 255, 255))
pygame.draw.circle(surface, (0, 0, 0), (10, 10), 15, 0)
pygame.display.update()
pygame.image.save(surface, os.path.expanduser("~/Desktop/pic.png"))

这样可以将'surface'Surface上的任何内容保存到用户的桌面上,如pic.png

答案 6 :(得分:0)

如果要捕捉特定的正在运行的Windows应用程序,则必须通过遍历系统中所有打开的窗口来获取句柄。

如果您可以通过Python脚本打开此应用,则会更加轻松。 然后,您可以将进程pid转换为窗口句柄。

另一个挑战是捕捉在特定监视器上运行的应用程序。我有3个监控器系统,我不得不弄清楚如何捕捉显示2和3。

此示例将获取多个应用程序快照并将其保存到JPEG文件中。

import wx

print(wx.version())
app=wx.App()  # Need to create an App instance before doing anything
dc=wx.Display.GetCount()
print(dc)
#e(0)
displays = (wx.Display(i) for i in range(wx.Display.GetCount()))
sizes = [display.GetGeometry().GetSize() for display in displays]

for (i,s) in enumerate(sizes):
    print("Monitor{} size is {}".format(i,s))   
screen = wx.ScreenDC()
#pprint(dir(screen))
size = screen.GetSize()

print("Width = {}".format(size[0]))
print("Heigh = {}".format(size[1]))

width=size[0]
height=size[1]
x,y,w,h =putty_rect

bmp = wx.Bitmap(w,h)
mem = wx.MemoryDC(bmp)

for i in range(98):
    if 1:
        #1-st display:

        #pprint(putty_rect)
        #e(0)

        mem.Blit(-x,-y,w+x,h+y, screen, 0,0)

    if 0:
        #2-nd display:
        mem.Blit(0, 0, x,y, screen, width,0)
    #e(0)

    if 0:
        #3-rd display:
        mem.Blit(0, 0, width, height, screen, width*2,0)

    bmp.SaveFile(os.path.join(home,"image_%s.jpg" % i), wx.BITMAP_TYPE_JPEG)    
    print (i)
    sleep(0.2)
del mem

详细信息为here

答案 7 :(得分:0)

import pyautogui

s = pyautogui.screenshot()
s.save(r'C:\\Users\\NAME\\Pictures\\s.png')

答案 8 :(得分:-1)

首先,使用 pip3 安装 PrtSc 库。

 import PrtSc.PrtSc as Screen
 screenshot=PrtSc.PrtSc(True,'filename.png')