编写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方法需要多少时间的主要内容,如果未能解决你的问题,请参考以下文章