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

本文通过Python的PIL库ImageGrab.grab方法进行屏幕截图,测试不同分辨率下的帧率,以评估其用于创建GIF动图的可行性。在1920x1080分辨率下,每秒能实现16次截图,在1280x720分辨率下达到30次。作者展示了如何编写一个简单的程序来测量这个频率,并分享了测试环境和结果,表明在某些条件下使用Python进行录屏制作GIF是可能的。
摘要由CSDN通过智能技术生成

想用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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Python的PIL库和pyautogui库来编写一个当屏幕上出现特定画面时自动点击的程序。 首先,使用PIL库中的函数获取屏幕截图,并在截图中搜索特定画面的位置。可以使用PIL库中的ImageGrab模块获取屏幕截图,然后使用Image模块的find()方法查找特定画面的位置。 接下来,如果找到了特定画面,可以使用pyautogui库中的click()函数在该位置自动点击。 以下是一个简单的示例代码: ``` import pyautogui import time from PIL import ImageGrab # 画面识别函数 def check_screen(image): # 在屏幕截图中搜索特定画面,返回坐标 # 如果找不到,返回None # 这里假设要搜索的画面是一个红色的正方形 box = image.find((255, 0, 0)) if box is not None: return box.left, box.top else: return None # 主程序 while True: # 获取屏幕截图 image = ImageGrab.grab() # 检查是否出现特定画面 pos = check_screen(image) if pos is not None: # 如果出现特定画面,点击该位置 pyautogui.click(pos) # 等待一段时间后再进行下一次检查 time.sleep(1) ``` 这个程序将每隔1秒钟获取一次屏幕截图,并检查是否出现了一个红色正方形。如果出现了,程序将在该位置进行一次点击。 ### 回答2: 你可以使用Python编写一个程序来检测屏幕上特定画面并执行点击操作。这个过程可以通过以下几个步骤实现: 1. 首先,你需要安装Python的图像处理库,如OpenCV和Pillow。你可以使用`pip`安装它们。 2. 然后,你可以使用OpenCV库中的函数来截取屏幕图像。这可以通过使用`cv2.VideoCapture`和`cv2.imshow`函数来实现。 3. 接下来,你需要使用Pillow库的函数来加载和处理特定画面,以便进行匹配。你可以使用`Image.open`和`Image.load`函数来加载和处理图片。 4. 接着,你可以使用OpenCV库的函数来进行图像匹配。你可以使用`cv2.matchTemplate`和`cv2.minMaxLoc`函数。 5. 如果匹配成功,你可以使用自动化库(如PyAutoGUI)来模拟鼠标点击。 以下是一个示例代码演示如何实现: ```python import cv2 import pyautogui from PIL import Image # 截取屏幕图像 def capture_screen(): screen = pyautogui.screenshot() return cv2.cvtColor(np.array(screen), cv2.COLOR_RGB2BGR) def main(): # 加载特定画面 target_image = Image.open('target_image.png') target_image = target_image.load() while True: # 获取屏幕图像 screen_image = capture_screen() # 进行图像匹配 result = cv2.matchTemplate(screen_image, target_image, cv2.TM_CCOEFF_NORMED) _, max_val, _, _ = cv2.minMaxLoc(result) # 判断匹配是否成功 if max_val > 0.9: # 进行鼠标点击 pyautogui.click() if __name__ == '__main__': main() ``` 上述代码使用了OpenCV来进行屏幕截图、图像匹配,并使用PyAutoGUI来模拟鼠标点击。你可以将特定画面存储为`target_image.png`,并在代码中加载它。 ### 回答3: 使用Python编写一个当屏幕上出现特定画面时点击的程序可以通过使用第三方库PyAutoGUI来实现。 首先,我们需要使用Python中的OpenCV库来捕捉屏幕图像,并使用模板匹配的方法来检测特定画面是否出现在屏幕上。 接下来,我们可以编写一个循环,不断地捕捉屏幕图像,并使用模板匹配的方法来检测指定的特定画面。当检测到特定画面时,我们可以使用PyAutoGUI库模拟鼠标点击屏幕上的指定位置。 以下是一个简单的示例代码: ```python import cv2 import pyautogui def find_image_on_screen(template_path): template = cv2.imread(template_path, 0) # 读取模板画面 w, h = template.shape[::-1] # 获取模板画面的宽高 while True: # 捕捉屏幕图像 screen = pyautogui.screenshot() screen_gray = cv2.cvtColor(screen, cv2.COLOR_RGB2GRAY) # 使用模板匹配方法检测特定画面 res = cv2.matchTemplate(screen_gray, template, cv2.TM_CCOEFF_NORMED) threshold = 0.8 # 设置匹配阈值 loc = np.where(res >= threshold) if len(loc[0]) > 0: # 找到特定画面,模拟鼠标点击屏幕上的指定位置 x = loc[1][0] + w // 2 y = loc[0][0] + h // 2 pyautogui.click(x, y) break find_image_on_screen("template.png") # 传入模板画面的路径 ``` 在这个示例代码中,我们传入一个模板画面的路径,然后使用模板画面进行匹配,当屏幕上出现这个特定画面时,程序会模拟鼠标点击屏幕上的中心位置。 注意,在使用PyAutoGUI模拟鼠标点击时,请确保程序运行在前台并保持屏幕可见,否则点击操作可能无效。 这个示例主要展示了实现原理,具体参数和细节还可以根据实际需要进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值