- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在制作一个自动答题器,我想问一下我可以做些什么来优化我的代码以使其更快,它目前正在工作但是它识别像素颜色然后点击太慢。我试过使用空间它似乎是一样的。
如果它只是一个像素而不是一个盒子,会不会更快?另外,有没有 a.sum() 的替代方法,而不是计算总数,使用原始值会更快。
该项目的目的是在屏幕上找到一个像素/框,当颜色值变为某种颜色(白色或灰色范围)时,它会点击一个按钮。
from pyautogui import *
from PIL import ImageGrab
from PIL import ImageOps
import pyautogui
import time
import keyboard
import random
from numpy import*
import os
emark = (1440, 1026)
pyautogui.click(x=1063, y=544)
def image_grab():
box = (emark[0]+1,emark[1],emark[0]+11,emark[1]+2)
image = ImageGrab.grab(box)
grayImage = ImageOps.grayscale(image)
a = array(grayImage.getcolors())
return a.sum()
def clickButton():
#pyautogui.press('space')
pyautogui.click(x=1160, y=600)
while True:
image_grab()
if 1000 <= image_grab() <= 1700:
clickButton()
最佳答案
您不必进行所有颜色转换和 numpy 数组操作。只需抓取一个像素,保存它的颜色值,然后抓取一个新像素,并测试是否相等。
#! /usr/bin/env python3
from PIL import ImageGrab
import pyautogui
emark = ( 1440, 1026 )
pyautogui .click( x=1063, y=544 )
pixel = ( emark[0]-1, emark[1]-1, emark[0]+1, emark[1]+1 )
original_pixel_color = ImageGrab .grab( pixel ) .getpixel( (0,0) )
## print( original_pixel_color )
def image_grab():
new_pixel_color = ImageGrab .grab( pixel ) .getpixel( (0,0) )
return new_pixel_color == original_pixel_color
def clickButton():
## print('yup')
pyautogui .click( x=1160, y=600 )
while True:
if not image_grab():
clickButton()
## I don't know if pyautogui has a built in pause function,
## or repeat delay, but you probably want a time.sleep(1)
## or similar here, so it doesn't rapid-fire autoclick
## 500 times in a row, once that pixel changes color.
您的脚本不需要,但我认为 getpixel()
是那些 ImageGrab 方法中最快的,它返回可比较的颜色数据。
import timeit
loops = 99999
print( 'tobytes()', timeit .timeit( lambda : original_pixel_color .tobytes(), number=loops ) )
print( 'getcolors()', timeit .timeit( lambda : original_pixel_color .getcolors(), number=loops ) )
print( 'getpixel()', timeit .timeit( lambda : original_pixel_color .getpixel( (0,0) ), number=loops ) )
编辑: ImageGrab .grab( pixel )
根据您给它的大小抓取一个屏幕矩形。
( emark[0] -1, emark[1] -1, emark[0] +1, emark[1] +1 ) ## x, y, w, h
由于 PIL 的限制,最小坐标空间为 2x2,因此 emark -1, emark +1
。
我认为这是对的,但我要在这里记忆多年前的事情。他们可能会说确定的像素位置在 SO 某处,但您可以尝试
( emark[0], emark[1], emark[0] +2, emark[1] +2 )
如果差一个。无论哪种方式,它实际上只抓取一个像素。
.getpixel( (0,0) )
以元组形式返回该像素的 RGB 值。
所以是的,您可以在那里使用自己的值,而不是一开始就捕捉一个像素。
original_pixel_color = ( 240, 240, 240 )
def brighter_than():
new_pixel_color = ImageGrab .grab( pixel ) .getpixel( (0,0) )
r = new_pixel_color[0] >= original_pixel_color[0]
g = new_pixel_color[1] >= original_pixel_color[1]
b = new_pixel_color[2] >= original_pixel_color[2]
return r and g and b
while True:
if not brighter_than():
clickButton()
此外,在开始时,导入之后:
Fail-Safes
Set up a 2.5 second pause after each PyAutoGUI call:
import pyautogui
pyautogui .PAUSE = 2.5
https://pyautogui.readthedocs.io/en/latest/quickstart.html
Post postscript:在某些情况下,他们正在保存/显示图像,而不仅仅是获取颜色,因此可以去除其中的很多内容。使用 sp
是因为它当时更容易理解,而且对于我正在做的事情来说足够快。
import subprocess as sp
xx, yy = 640, 480
ww, hh = 1, 1
pixel_location = f'{xx},{yy},{ww},{hh}'
cmd = [ 'scrot', 'temp.tiff', '--autoselect', pixel_location, '--silent' ]
sp .Popen( cmd )
我知道 scrot 是一个 Linux 命令,但它与 OSX 中的屏幕截图类似,您只需要将 args 调整为它期望的任何值。我之所以这么说是因为它对我有用,但是调用额外的 BASH 进程会产生少量开销和几毫秒的延迟,因此您可能希望直接调用库...
想想 那个答案 是在 Tiger 的回应中,n4p 去掉了很多,所以这是有希望的;但是那些函数调用也不在我的知识范围之内,所以在这一点上做出有根据的猜测。在这里没有办法测试它,所以你必须尝试看看。如果可能的话,尝试通过使用快速结构解包来跳过 numpy 和 pillow - 这应该是最快的。
import struct
import pyautogui
import Quartz.CoreGraphics as CG
pyautogui .PAUSE = 2.5
xx, yy = 500, 500
ww, hh = 1, 1
region = CG .CGRectMake( xx, yy, ww, hh )
orig = ( 240, 240, 240 )
def brighter_than(): ## think these properties are right...
pixel = CG .CGWindowListCreateImage( region, CG .kCGWindowListOptionOnScreenOnly, CG .kCGNullWindowID, CG .kCGWindowImageDefault )
data = CG .CGDataProviderCopyData( CG .CGImageGetDataProvider( pixel ) )
## backwards from RGBA, Mac stores pixels as BGRA instead
b, g, r, a = struct .unpack_from( 'BBBB', data ) ## BBBB = 4 Bytes
return r >= orig[0] and g >= orig[1] and b >= orig[2]
while True:
if brighter_than():
clickButton()
其中一些信息来自 dbr 的 blog writeup . CGRectMake()
来自 Converting CGImage to python image (pil/opencv) .其他人都在使用 region = CG.CGRectInfinite
,它可能会占用整个屏幕而不是一个像素。
关于python - 为什么我的 Python PyAutoGUI/Image 抓取脚本很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68198927/
我有一个 view我拖了一个UITableView在里面,还有 2 UIImageView s(第一个显示背景图像,第二个只是在 View 顶部显示一个非常小的标题和图像)。 它们都设置为 weak特
我尝试用 C# 编写简单的 PostgreSQL 查询。第一个 connection.open() 需要 20 秒。其他连接立即执行。 PGAdmin 工作也很慢。如果我打开“查看所有行”,它也需要大
我制作了一个 html5 视频播放器,我注意到如果当前播放的视频有点大,搜索时间会异常地长。 越接近终点,寻找的时间越长;独立于我之前是否去过那里/与当前时间点的距离有多近,或者我是否缓冲了整个视频。
我正在使用 MaterialDatePicker,但速度很慢。 public class MainActivity extends AppCompatActivity { MaterialDa
我想知道为什么 MyBatis 是 慢 在我的应用程序中。 对于 SELECT COUNT(*) ,所用时间为: 20 秒 - 第一个请求 2-3 秒 - 后续请求 缓存很可能使后续请求更快。 配置
我已经安装了一个默认的开箱即用的 FreeSwitch 实例,但是当我尝试进行内部调用(分机到分机)时,大约需要 12 秒才能建立调用并且我可以听到铃声。 当我查看日志时,我几乎立即看到了连接请求,但
我已经放弃了让它跑得更快的实际尝试。 我最大的问题是,当我插入 html 时,应用程序会变慢到爬行。我有一个进度条,我正在调用 QCoreApplication.processEvents() (顺便
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
Doxygen 在我们的代码库上运行大约需要 12 个小时。这主要是因为有很多代码要处理(约 1.5M 行)。然而,它很快就会接近我们无法进行夜间文档更新的地步,因为它们需要太长时间。我们已经不得不减
我正在重写我的旧渲染管道。我根据自己的喜好创建了一个非常精简的原型(prototype),令我震惊的是,我原来相当复杂且优化不佳的管道与 super 简单的原型(prototype)具有完全相同的性能
我想为我的网站使用 Gridster,但我需要使用“add_widget”命令添加很多小部件。我做了一个测试,我认为“add_widget”功能存在问题:网格越来越慢并且存在内存泄漏。 您可以在此视频
我有一份包含图表和表格的报告。 我正在使用 html2canvas与 jsPDF将此报告导出为 PDF 文件。 但是这个过程耗时很长,超过11000ms。 我尝试更改格式和质量,但没有任何效果。 请看
我正在查询大于时间戳的类的所有修订,使用: AuditReaderFactory .get(emf.createEntityManager()) .createQuery().forR
我最近想加速一个加密系统。而在这个系统中,它将使用mysql,因此它包括文件。 而且我发现系统运行缓慢并不是因为加解密,而是因为处理一些sql语句。 它将在运行时使用内存数据库,并使用 中的 mys
谁能看出为什么这需要大约 20 秒?我正在运行下面的代码以将 JSON 请求发布到本地服务器 192.168.1.127。 curl -H "Content-type: application/jso
我有两个表:Posts 和Tags,其中存储了用户发布的文章以及他们为文章附加的标签。 PostTags 表用于表示文章 ID 和标签 ID 的关系。结构如下: 帖子: id | title | au
一个我应该能够自己回答但我没有,而且在谷歌中也找不到任何答案的问题: 我有一个表,其中包含具有以下结构的 500 万行: CREATE TABLE IF NOT EXISTS `files_histo
以下查询在具有大约 50 万行的表上执行需要 20 多秒: SELECT images.id, images.user_id, images_locale.filename, extension, s
我正在使用 $.getJSON 来提取对象 list (100 个项目,不是一个大集合),但 XHR 调用需要 8-10 秒。 想了解我是否缺少某些内容或我可以采取哪些措施来加快我的计划? 最佳答案
在这段代码中,我从网站获取一个字符串并将其显示在标签上。在标签上显示字符串真的很慢!大约 10 秒。但是在控制台 println (date) 上打印字符串时是立即的。我该如何解决这个问题?
我是一名优秀的程序员,十分优秀!