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 unicode 字符串?

    Question PyWin32 似乎很乐意将 null 终止的 unicode 字符串作为返回值 我想以 正确 的方式处理这些字符串 假设我得到一个像这样的字符串 u C Users Guest MyFile asy x00 x00sy
  • 检查 Python 中的可迭代对象中的所有元素的谓词是否计算为 true

    我很确定有一个常见的习语 但我无法通过谷歌搜索找到它 这是我想做的 用Java Applies the predicate to all elements of the iterable and returns true if all ev
  • 如何在Python中同时运行两只乌龟?

    我试图让两只乌龟一起移动 而不是一只接着另一只移动 例如 a turtle Turtle b turtle Turtle a forward 100 b forward 100 但这只能让他们一前一后地移动 有没有办法让它们同时移动 有没有
  • Python 2.7 中的断言对我来说不起作用示例assertIn

    我的 Mac 上安装了 python 2 7 通过在终端中运行 python v 进行验证 当我尝试使用任何新的 2 7 断言方法时 我收到 AtributeError 我看过http docs python org 2 library u
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • 如果未引发异常,则通过 Python 单元测试

    在Python中unittest框架 是否有一种方法可以在未引发异常的情况下通过单元测试 否则会因 AssertRaise 而失败 如果我正确理解你的问题 你could做这样的事情 def test does not raise on va
  • 在没有模型的情况下将自定义页面添加到 django admin

    我正在尝试在没有模型关联的情况下向管理员添加自定义页面 这就是我迄今为止所取得的成就 class MyCustomAdmin AdminSite def get urls self from django conf urls import
  • 如何使用文本相似性删除 pandas 数据框中相似(不重复)的行?

    我有数千个数据 这些数据可能相似也可能不相似 使用 python 的默认函数 drop duplicates 并没有真正的帮助 因为它们只检测相似的数据 例如 如果我的数据包含类似以下内容怎么办 嗨 早上好 嗨 早上好 Python 不会将
  • .pyx 文件出现未知文件类型错误

    我正在尝试构建一个包含 pyx 文件的 Python 包 pyregion 但在构建过程中出现错误 检查以下输出 python setup py build running build running build py creating b
  • 使用 Keras np_utils.to_categorical 的问题

    我正在尝试将整数的 one hot 向量数组制作为 keras 将能够使用的 one hot 向量数组来拟合我的模型 这是代码的相关部分 Y train np hstack np asarray dataframe output vecto
  • ANTLR 获取并拆分词法分析器内容

    首先 对我的英语感到抱歉 我还在学习 我为我的框架编写 Python 模块 用于解析 CSS 文件 我尝试了 regex ply python 词法分析器和解析器 但我发现自己在 ANTLR 中 第一次尝试 我需要解析 CSS 文件中的注释
  • 使用“默认”环境变量启动新的子进程

    我正在编写一个构建脚本来解析依赖的共享库 及其共享库等 这些共享库在正常情况下是不存在的PATH环境变量 为了使构建过程正常工作 让编译器找到这些库 PATH已更改为包含这些库的目录 构建过程是这样的 加载器脚本 更改 PATH gt 基于
  • 在 keras 中保存和加载权重

    我试图从我训练过的模型中保存和加载权重 我用来保存模型的代码是 TensorBoard log dir output model fit generator image a b gen batch size steps per epoch
  • 在系统托盘中隐藏 tkinter 窗口 [重复]

    这个问题在这里已经有答案了 我正在制作一个程序来提醒我朋友的生日 这样我就不会忘记祝福他们 为此 我制作了两个 tkinter 窗口 1 First one is for entering name and birth date 2 Sec
  • 动态过滤 pandas 数据框

    我正在尝试使用三列的阈值来过滤 pandas 数据框 import pandas as pd df pd DataFrame A 6 2 10 5 3 B 2 5 3 2 6 C 5 2 1 8 2 df df loc df A gt 0
  • Django Admin 中的反向内联

    我有以下 2 个型号 现在我需要将模型 A 内联到模型 B 的页面上 模型 py class A models Model name models CharField max length 50 class B models Model n
  • 混淆矩阵不支持多标签指示符

    multilabel indicator is not supported是我在尝试运行时收到的错误消息 confusion matrix y test predictions y test is a DataFrame其形状为 Horse
  • 如何与其他用户一起使用 pyenv?

    如何与其他用户一起使用 pyenv 例如 如果我在用户 test 的环境中安装了 pyenv 则当我以 test 身份登录时可以使用 pyenv 但是 当我以其他用户 例如 root 身份登录时如何使用 pyenv 即使你这么做了 我也会s
  • python 线程安全可变对象复制

    Is 蟒蛇的copy http docs python org 2 library copy html模块线程安全吗 如果不是 我应该如何在 python 中以线程安全的方式复制 deepcopy 可变对象 蟒蛇的GIL http en w
  • TKinter 中的禁用/启用按钮

    我正在尝试制作一个像开关一样的按钮 所以如果我单击禁用按钮 它将禁用 按钮 有效 如果我再次按下它 它将再次启用它 我尝试了 if else 之类的东西 但没有成功 这是一个例子 from tkinter import fenster Tk

随机推荐

  • 使用 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