编写python程序用来测试执行一次ImageGrab.grab方法需要多少时间

Posted geng_zhaoying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写python程序用来测试执行一次ImageGrab.grab方法需要多少时间相关的知识,希望对你有一定的参考价值。

想用pillow库ImageGrab.grab方法编写一个录屏程序,录制自己编写游戏界面,将录制多个图像转换为GIF格式动图,作为游戏的效果图。但网上文章说,执行一次grab方法要0.3秒,如果这样慢,显然上述设想无法实现。因此想编一个python程序用来测试执行一次grab方法到底需要多少时间。思路是,在循环语句中连续调用ImageGrab.grab方法截屏,1秒后,停止循环程序,循环次数就是每秒调用ImageGrab.grab方法截屏次数,这个就是每秒帧数(fps)。
测试时,因PIL(pillow)的原因,必须在win10设置中将“显示”-“更改文本、应用等项目的大小”修改为100%,否则选取区域不正确,在此设置下,将显示分辨率设置为1920x1080为每秒16次调用ImageGrab.grab方法截屏,1280x720为每秒30次,全屏和1/4全屏每秒次数相同。如GIF文件每秒帧数不超过10,在现有计算机最高分辨率下,用python编写上述录屏程序还是可能的。自己以前编写的游戏GIF效果图没有一个fps>10。
测试条件如下:
Python 3.8.2
PIL 8.1.2
计算机:荣耀MagicBook 2019
处理器 AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx 2.10 GHz
RAM 8.00 GB (6.94 GB 可用)
系统类型 64 位操作系统, 基于 x64 的处理器
win10操作系统
版本 Windows 10 家庭中文版
版本号 20H2 安装日期 ‎2021/‎3/‎12
完整程序如下。

import tkinter as tk
from PIL import ImageGrab,Image
from threading import Timer
def test_fps(k=1):                             #截屏程序,k=1截全屏,k=2截1/4屏,比较两者fps
    global n
    ws = root.winfo_screenwidth()              #屏幕长和宽 
    hs = root.winfo_screenheight()
    t = Timer(1,dojob)                         #1秒后,在另一线程调用dojob方法
    m,n=0,0    
    t.start()                                   #启动定时
    while n==0:                                 #n==0,循环,1秒后调用dojob方法,n=1,退出循环   
        p=ImageGrab.grab((0,0,ws//k,hs//k))#因PIL的原因,必须将显示设置里的缩放比例调成100%
        m+=1                                    #调用grab方法次数
    label['text']='每秒'+str(m)+'次'             #退出循环,显示调用grab方法次数
def dojob():
    global n
    n=1    
def test_fps1():
    label['text']='            '
    root.update_idletasks()             #立即更新
    test_fps()
def test_fps2():
    label['text']='            '
    root.update_idletasks()
    test_fps(2)    
root = tk.Tk()
root.geometry('200x200+50+50')
tk.Button(root, text="测全屏录屏速率", command=test_fps1).pack()
tk.Button(root, text="测1/4屏录屏速率", command=test_fps2).pack()
label=tk.Label(text='')
label.pack()
root.mainloop()

以上是关于编写python程序用来测试执行一次ImageGrab.grab方法需要多少时间的主要内容,如果未能解决你的问题,请参考以下文章

Python多进程原理与实现

进程线程,基础

Python线程与进程的区别

Python多进程原理与实现

Python_并发编程(线程 进程 协程)

python之路-----多线程与多进度