Python:获取和保存屏幕截图的最快方法

2023-12-01

我一直在努力想出一个脚本,让我每秒可以多次截取桌面屏幕截图。我用的是Win10。

PIL:

from PIL import ImageGrab
import time

while True:
    im = ImageGrab.grab()
    fname = "dropfolder/%s.png" %int(time.time())
    im.save(fname,'PNG') 

结果每张图像 1.01 秒。

PyScreeze (https://github.com/asweigart/pyscreeze):

import pyscreeze
import time

while True:
    fname = "dropfolder/%s.png" %int(time.time())
    x = pyscreeze.screenshot(fname)

结果每张图像 1.00 秒。

Win32:

import win32gui
import win32ui 
import win32con
import time

w=1920 #res
h=1080 #res

while True:
    wDC = win32gui.GetWindowDC(0)
    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)
    fname = "dropfolder/%s.png" %int(time.time())
    dataBitMap.SaveBitmapFile(cDC, fname)
    dcObj.DeleteDC()
    cDC.DeleteDC()
    win32gui.ReleaseDC(0, wDC)
    win32gui.DeleteObject(dataBitMap.GetHandle())

结果每张图像 1.01 秒。

然后我偶然发现了线程(在 Windows 上使用 python 进行屏幕截图的最快方法)其中有人建议 gtk 会产生惊人的结果。

但是使用gtk:

import gtk
import time

img_width = gtk.gdk.screen_width()
img_height = gtk.gdk.screen_height()

while True:
    screengrab = gtk.gdk.Pixbuf(
        gtk.gdk.COLORSPACE_RGB,
        False,
        8,
        img_width,
        img_height
    )

    fname = "dropfolder/%s.png" %int(time.time())
    screengrab.get_from_drawable(
        gtk.gdk.get_default_root_window(),
        gtk.gdk.colormap_get_system(),
        0, 0, 0, 0,
        img_width,
        img_height
        ).save(fname, 'png')

结果每张图像 2.34 秒。

在我看来,我好像做错了什么,因为人们使用 gtk 获得了很好的结果。

有什么建议可以加快这个过程吗?

Thanks!


您的第一个解决方案应该是每秒提供多于一张图片。但问题是您将覆盖同一秒内出现的任何图片,即它们都将具有相同的文件名。为了解决这个问题,您可以创建包含十分之一秒的文件名,如下所示:

from PIL import ImageGrab
from datetime import datetime

while True:
    im = ImageGrab.grab()
    dt = datetime.now()
    fname = "pic_{}.{}.png".format(dt.strftime("%H%M_%S"), dt.microsecond // 100000)
    im.save(fname, 'png') 

在我的机器上,这给出了以下输出:

pic_1143_24.5.png
pic_1143_24.9.png
pic_1143_25.3.png
pic_1143_25.7.png
pic_1143_26.0.png
pic_1143_26.4.png
pic_1143_26.8.png
pic_1143_27.2.png
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:获取和保存屏幕截图的最快方法 的相关文章

  • 使用Python开发Web应用程序

    我一直在用 python 做一些工作 但这都是针对独立应用程序的 我很想知道 python 的任何分支是否支持 Web 开发 有人还会建议一个好的教程或网站吗 我可以从中学习一些使用 python 进行 Web 开发的基础知识 既然大家都说
  • 如何收集列表、字典等中重复计算的结果(或制作修改每个元素的列表的副本)?

    There are a great many existing Q A on Stack Overflow on this general theme but they are all either poor quality typical
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代

随机推荐

  • 使用 matplotlib 绘制时间序列 pandas 数据框时标签错误

    我正在处理包含 1 周数据的数据框 y ds 2017 08 31 10 15 00 1 000000 2017 08 31 10 20 00 1 049107 2017 08 31 10 25 00 1 098214 2017 09 07
  • 使用c#从串口部分接收消息

    我使用下面的代码使用 C 接收来自串行端口的消息 void comPort DataReceived object sender SerialDataReceivedEventArgs e if comPort IsOpen true st
  • 在 C++ 中将二进制字符串输出到二进制文件

    假设我有一个字符串 其中包含像这样的二进制文件 0110110101011110110010010000010 有没有一种简单的方法将该字符串输出到二进制文件中 以便该文件包含 0110110101011110110010010000010
  • 如何使我的 json 数组排序函数不区分大小写?

    我有以下小提琴 这是我的尝试 获取一个 json 数组 按显示名称值对数组进行排序 将排序后的数组作为列表项添加到 DOM 我的问题是 我希望能够在排序时不考虑值的大小写 我注意到它考虑了大小写并将大写值放在第一位 我相当确定这是在某个地方
  • 数据集 API“flat_map”方法对与“map”方法一起使用的相同代码产生错误

    我正在尝试创建一个管道来使用 TensorFlow Dataset API 和 Pandas 读取多个 CSV 文件 然而 使用flat map方法正在产生错误 但是 如果我使用map方法我能够构建代码并在会话中运行它 这是我正在使用的代码
  • Typescript 版本不更新

    我正在运行以下命令将 TypeScript 版本从 1 8 5 更新到 2 0 7 npm install g 打字稿 它显示为 电子邮件受保护 之后 当我尝试使用以下命令手动检查它时 tsc 版本 它告诉我 版本1 8 5 请告诉我如何将
  • 未找到“Jenssegers\Mongodb\MongodbServiceProvider”类

    我想用https github com jenssegers laravel mongodb为了使用 laravel 5 连接到 Mongodb 我已经安装了 MongoDB php 驱动程序 然后使用命令安装了 laravel mongo
  • R 中的多重 T 检验

    我的矩阵中有 94 个变量 样本 蛋白质 组 和 172 个观察值 Sample Protein1 Protein2 Protein92 Group 1 1 53 3 325 5 63 0 2 2 32 3 451 6 32 0 103 3
  • Android如何在具有图像视图和文本视图的圆形中创建这样的视图

    i want to create a view like this i have posted in screen shot in circle shape of layout with one image view with some b
  • vb 2008 网络浏览器替代品

    你好 我正在使用Visual Basic 2008 Express是否还有其他网络浏览器 例如gekoWebBrowser 但文件较少 或者是否可以更改 Visual Basic 使用的默认浏览器 从 IE 到 Opera chrome f
  • 通过 ssms 远程运行时,SSIS 作业失败,但在 SQL Server 上运行良好

    在开发盒上安装了 SQL Server 2016 并带有 SSIS 拥有一个循环遍历目录并验证 XML 文件的包 当在 SQL Server 上执行时 该作业可以通过 Integration Services 目录和 SQL Server
  • Python __getattr__ 执行多次

    我一直在努力实施 getattr 函数如下例所示 PEP 562 模块 getattr and dir 我不明白为什么这段简单的代码 lib py def getattr name print name main py from lib i
  • 在 Firebase 客户端应用程序中实现可调用的云函数

    我最近发现了Firebase 可调用函数这允许我从客户端调用类似 HTTPS 触发器的函数 并且具有 auth 支持 我很难在现有的 Firebase Web 客户端应用程序中实现这一新功能 我正在运行一些云函数 其中有一些我想将其转换为
  • 连接计算日期之间值的表

    所以我有下面两个表 Table A Date num 01 16 15 10 02 20 15 12 03 20 15 13 Table B Date Value 01 02 15 100 01 03 15 101 01 17 15 102
  • C# SMO 和 SqlEnum 引用错误

    我正在做一个 C 项目VS2013正在使用smo目的 我安装了 Install Package Microsoft SqlServer Scripting Install Package Microsoft SqlServer SqlEnu
  • Azure服务总线:如何续订锁定?

    如何更新接收队列消息处理程序上的锁 在事件处理程序上 测试消息没有更新锁定属性 Message testMessage https learn microsoft com en us dotnet api microsoft service
  • R Shiny:保留旧输出

    在闪亮的应用程序中 有没有办法保留旧的反应输出并将其与新的反应输出一起显示在应用程序中 举个例子 假设我想显示线性模型的汇总表 我逐渐向其中添加更多变量 我目前有一个checkboxGroupInput我使用该面板选择要包含在模型中的解释变
  • 字节算术:如何减去字节变量? [复制]

    这个问题在这里已经有答案了 当我尝试执行以下操作时出现错误 byte a 23 a a 1 编译器给出这个错误 Test java 8 发现可能存在精度损失 需要 int 字节 a a 1 1 个错误 铸造并不能解决错误 为什么编译器不让我
  • jq 的意外循环

    我正在尝试将 bash 中的表从 json 打印到标准输出jq key name doc count 1000 values over time buckets key as string 2019 05 01 11 00 00 000 k
  • Python:获取和保存屏幕截图的最快方法

    我一直在努力想出一个脚本 让我每秒可以多次截取桌面屏幕截图 我用的是Win10 PIL from PIL import ImageGrab import time while True im ImageGrab grab fname dro