使用 Python 在 Windows 上截屏?

2025-02-27 09:06:00
admin
原创
60
摘要:问题描述:我正在创建一个 Beta 测试人员报告模块,以便他们可以发送对我的软件的评论,但我希望可以选择在报告中包含屏幕截图。如何在 Windows 上使用 Python 截取屏幕截图?我在 Linux 上找到了几个示例,但在 Windows 上运气不佳。解决方案 1:另一种非常快速的方法是MSS模块。它与其...

问题描述:

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


解决方案 1:

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

from mss import mss

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

只需找到screenshot.png包含第一个显示器屏幕截图的文件即可。有很多可能的自定义,您可以使用ScreenShot对象和 OpenCV/Numpy/PIL/等进行操作。

解决方案 2:

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

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

import wx
app = wx.App()  # Need to create an App instance before doing anything
screen = wx.ScreenDC()
size = screen.GetSize()
bmp = wx.Bitmap(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)

解决方案 3:

您可以使用 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:

对于 pyautogui 用户:

import pyautogui
screenshot = pyautogui.screenshot()

解决方案 5:

截屏的一个简单方法是通过 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 上的所有内容保存到用户的桌面,如 pic.png

解决方案 6:

如果您想要捕捉特定正在运行的 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

详细信息请见此处

解决方案 7:

首先,使用 pip3 安装 PrtSc 库。

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

解决方案 8:

我遇到了一些 Python 截图问题,到目前为止,使用 shot-scraper 已经获得了最好的结果。

pip install shot-scraper

然后安装Playwright

shot-scraper install

截屏:

shot-scraper <URL>

详细信息和代码位于 GitHub 存储库中。

解决方案 9:

另一个解决方案是使用 PowerShell 脚本作为与 Windows 相关的 PowerShell,因此您可以从 python 运行 PowerShell 脚本:

来自 rogerdpack 的这个答案

PowerShell 截屏并保存在提供的路径内

[Reflection.Assembly]::LoadWithPartialName("System.Drawing")
function screenshot([Drawing.Rectangle]$bounds, $path) {
   $bmp = New-Object Drawing.Bitmap $bounds.width, $bounds.height
   $graphics = [Drawing.Graphics]::FromImage($bmp)
   
   $graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size)
   
   $bmp.Save($path)
   
   $graphics.Dispose()
   $bmp.Dispose()
}

$bounds = [Drawing.Rectangle]::FromLTRB(0, 0, 1000, 900)
screenshot $bounds "C:screenshot.png" # change path to somewhere writable

请注意,PowerShell 执行将默认被禁用,因此您可以使用 PowerShell 中的此行来启用它(请确保在完成后再次将其禁用以确保安全(通常这是为了执行 ps 文件)

Set-ExecutionPolicy RemoteSigned

此 python 代码用于从 python 运行 powershell 脚本

completed = subprocess.run(["powershell", "here add the previous powershell script that will take screenshot", cmd], capture_output=True)
# do something if success or failed
if completed.returncode != 0:
    print("An error occured: %s", hello_info.stderr)
else:
    print("Hello command executed successfully!")
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3018  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1880  
  PLM(产品生命周期管理)系统在企业产品研发、生产与管理过程中发挥着至关重要的作用。它能够整合产品全生命周期中的各类数据与流程,提升企业的协同效率、降低成本并加速产品上市。然而,不同企业由于业务模式、产品特性以及管理理念的差异,对PLM系统有着个性化的需求。如何实现这些个性化需求,成为企业在实施PLM系统定制开发时面临...
免费plm软件   0  
  在企业的发展进程中,跨地域协同工作变得愈发普遍和重要。不同地区的团队需要紧密合作,以实现资源共享、提高效率和创新能力。而产品生命周期管理(PLM)系统在这一过程中发挥着关键作用,尤其是其分布式架构,为跨地域协同提供了强大的支持。PLM系统概述PLM系统是一种用于管理产品从概念设计到退役全生命周期过程中所有数据和流程的软...
免费plm管理软件   0  
  在企业项目管理中,资源平衡是确保项目顺利推进、提高效率与效益的关键环节。产品生命周期管理(PLM)系统作为整合产品全生命周期信息与流程的重要工具,为实现资源平衡提供了强大的支持。通过合理运用PLM系统,企业能够优化资源分配、提升协同效率,从而在激烈的市场竞争中占据优势。接下来,我们将深入探讨如何借助PLM系统实现资源平...
plm系统   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用