有时候我们需要记录屏幕信息,使用python定时截屏是一个非常有效的方法,python定时截屏功能的实现分三步:①截屏:截屏的话有pillow这个模块,并且就两条语句,后面会看到。②定时任务:定时的话涉及到时间,所以会引入time这个模块。③保存:保存的话因为是会有多个图片,所以需要一个目录来接,这里我就放在了根目录下的png目录下,并且对目录是否存在做了处理。下面来具体说明python定时截屏实现的过程。
写在前面
因为暂时还没有想好做什么具体的某个项目来提升对python的理解,所以就自己想着做一下小玩意来加强一下自己对一些库和方法的理解
分析
1、截屏
截屏的话有pillow这个模块,并且就两条语句,后面会看到
2、定时任务
定时的话涉及到时间,所以会引入time这个模块
3、保存
保存的话因为是会有多个图片,所以需要一个目录来接,这里我就放在了根目录下的png目录下,并且对目录是否存在做了处理
代码
# python3 author jin xiang import time from PIL import ImageGrab import os #这里是为了如果找不到png这个目录的情况自己建一个png目录 absPath = os.path.abspath('.') path = [x for x in os.listdir('.') if os.path.isdir(x)] # print(path) if 'png' in path: #print('yes') pass else: #print('no') #创建目录 pngPath = os.path.join(absPath,'png') os.mkdir(pngPath) #截屏 def Screenshot(): nowtime = time.strftime('%Y_%m_%d_%H_%M_%S',time.localtime(time.time())) print(nowtime) # 截屏语句很简单的 im = ImageGrab.grab() # 保存(图个有png路径或者别的路径需要在这个路径下有这个目录,不然报错,所以我前面是做了规避,没路径我就自己建一个) im.save(r'png\%s.png' %(nowtime)) while True: print("截图!") Screenshot() print("暂停") print("\n") time.sleep(10) #定时10s看一下
效果
图片成功保存了。
以上为使用python实现定时截屏的方法。
参考:https://blog.csdn.net/jx950915/article/details/90676298
ImageGrab.grab()全屏抓取错误
截取的图片其实只有屏幕左上角的一部分
找遍全世界终于在Stack Overflow里找到了一个和我类似的问题
解决方法是把显示设置里的缩放比例调成100%
好像是因为PIL里的一个bug 我的电脑原来的比例是150%
调成100%之后截图,耶成功啦。
python关于win32api与ImageGrab.grab()截屏少内容的问题
前提:和系统有关系。有的不少内容,有的少。我是在测试环境下一点问题都没有,结果跑到生产环境就不行了。由于生产环境不能重装系统等因素,所有采用了本文的解决方案。
系统环境:win7 x64
项目介绍:使用pyautogui对pc端应用程序做自动化操作。
项目一开始使用的pyautogui.locateOnScreen("xxx.png")来定位,使用pyautogui.click()来实现点击,使用typewrite("xxx")来实现文本的输入。
本身项目难度不大,但是问题就出在生产环境下locateOnScreen()定位不到弹窗内容,一开始以为是cpu等硬件问题,导致截图延迟造成的(毕竟locateOnScreen的效率还是挺低的,一般全屏识别需要3-6s的时间)。所以就想着先把图片截取下来,然后再用locate本地对比识别。
随后就采用pyautogui.screenshot()来截屏,但是发现还是不行,当时认为是截取的太快了,因为screenshot的还是挺快的,1920*1080的截屏也只需要100ms,担心是tooltip(悬浮提示)还没有出来就截屏了,所以就加了time.sleep(1)来延迟截屏。但是结果还是没有东西,就想到是不是这个函数是异步处理的,不会等待sleep的执行完成,在这里走了一些弯路。
翻看了pyautogui的源码,发现screenshot在win下采用的是PIL的ImageGrab.grab()来实现的截屏。就用PIL模拟了一下screenshot的过程,结果还是截取不到tooltip。随后用了win32api的截图方法,结果还是截取不到。显然用win32api的效率已经是非常高了,当时又加了一些延迟,但是还是不行。
最后无奈,只好手动测试,到底为什么没有截取到(截至目前,没不知道原因是截取不到,一直还认为可能是延迟、程序异步的问题)。为了方便记录截图的时间,所以就想到了用个小工具显示再屏幕上,找工具太麻烦,就用了win7的小工具--时钟。这个就是问题的突破口。用了这个之后,发现之前的程序都截取不到这个小工具。又经过一系列的测试断定是截图函数的问题。
测试使用prtsc截图快捷键可以。所以才有了最后的方案,同样是采用win32api,但是需要用到快捷键截屏,并且需要用到剪切板来存储截图。
参考:https://blog.csdn.net/weixin_41972401/article/details/80913145