最快的截图库python/提高mss包的性能

Posted

技术标签:

【中文标题】最快的截图库python/提高mss包的性能【英文标题】:Fastest screenshot library python/improve performance of mss package 【发布时间】:2019-02-05 17:51:15 【问题描述】:

python 3.6,Windows 10: 我试图每 1-5 毫秒截取一个(部分)屏幕截图,然后在其上运行一些自定义 OCR 以提取一些数据。 我使用 mss 包截取屏幕截图的代码需要 16 到 47 毫秒,具体取决于我尝试捕获的像素数。

我有 3 行不同的问题:

1.) 是否有更快的 mss 替代方案?

2.) 有没有办法将 mss 速度提高 2-3 倍?

3.) 如何通过如下所示的代码分析/cProfile 输出了解如何实现性能改进?我阅读输出的方式是,很多时间都花在了“grab”函数上,但不清楚grab函数内部究竟花了这么长时间。

from mss import mss
import mss.tools as mss_tools
import cProfile, pstats, io

def profile(fnc):
    def inner(*args, **kwargs):
        pr = cProfile.Profile()
        pr.enable()
        retval = fnc(*args, **kwargs)
        pr.disable()
        s = io.StringIO()
        sortby = 'cumulative'
        ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
        ps.print_stats()
        print(s.getvalue())
        return retval

    return inner

@profile
def main():
    with mss() as sct:
        for i in range(100):
            monitor = sct.monitors[1]
            left = monitor["left"]
            top = monitor["top"]
            right = left + 1
            lower = top + 1
            bbox = (left, top, right, lower)
            shot = sct.grab(bbox)
            # mss_tools.to_png(shot.rgb, shot.size, output='partialscreen.png') #no performance difference with or without this
            # sct.shot() #code takes much more time (almost factor 10 higher compared to taking a large share of the screen)

main()

【问题讨论】:

【参考方案1】:

我是 MSS 开发者 :)

完全不偏不倚,我认为没有比 MSS 更快的了。但是,如果我们可以让它更快,我会 +1000 :)

与 MSS 无关的一点改进是从 for 循环中移出 vars:

@profile
def main():
    with mss() as sct:
        monitor = sct.monitors[1]
        left = monitor["left"]
        top = monitor["top"]
        right = left + 1
        lower = top + 1
        bbox = (left, top, right, lower)
        for i in range(100):
            shot = sct.grab(bbox)

要测量MSS.grab() 内部的内容,也许您可​​以将@profile 添加到MSS 中的方法中。丑陋但测试它是可以的。

在该方法中,有两件事可能需要时间:

BitBlt() GetDIBits()

我很想知道方法中的代码哪里比较慢。

【讨论】:

以上是关于最快的截图库python/提高mss包的性能的主要内容,如果未能解决你的问题,请参考以下文章

Python Kivy 从图库中选择图像

[python学习] 简单爬取图片站点图库中图片

python爬取优美图库海量图片,附加代码,一键爬取

Python2-比较当前图片跟图库那个图片相似

python lxml xpath爬取优美图库的妹子图代码

Python爬虫实战:1000图库大全别轻易点进来