Python实现屏幕截图的两种方式

  • 使用windows API
  • 使用PIL中的ImageGrab模块

下面对两者的特点和用法进行详细解释。

一、Python调用windows API实现屏幕截图

好处是

  • 灵活
  • 速度快

缺点是:

  • 写法繁琐
  • 不跨平台
import time import win32gui, win32ui, win32con, win32api def window_capture(filename): hwnd = 0 # 窗口的编号,0号表示当前活跃窗口 # 根据窗口句柄获取窗口的设备上下文DC(Divice Context) hwndDC = win32gui.GetWindowDC(hwnd) # 根据窗口的DC获取mfcDC mfcDC = win32ui.CreateDCFromHandle(hwndDC) # mfcDC创建可兼容的DC saveDC = mfcDC.CreateCompatibleDC() # 创建bigmap准备保存图片 saveBitMap = win32ui.CreateBitmap() # 获取监控器信息 MoniterDev = win32api.EnumDisplayMonitors(None, None) w = MoniterDev[0][2][2] h = MoniterDev[0][2][3] # print w,h   #图片大小 # 为bitmap开辟空间 saveBitMap.CreateCompatibleBitmap(mfcDC, w, h) # 高度saveDC,将截图保存到saveBitmap中 saveDC.SelectObject(saveBitMap) # 截取从左上角(0,0)长宽为(w,h)的图片 saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY) saveBitMap.SaveBitmapFile(saveDC, filename) beg = time.time() for i in range(10): window_capture('haha.jpg') end = time.time() print(end - beg)

输出结果为0.375秒,也就是说通过windows API每次截图只需要0.0375s,真是快得一逼呀。

二、使用PIL的ImageGrab模块

import time
import numpy as np
from PIL import ImageGrab
# 每抓取一次屏幕需要的时间约为1s,如果图像尺寸小一些效率就会高一些
beg = time.time()
debug = False
for i in range(10):
  img = ImageGrab.grab(bbox=(250, 161, 1141, 610))
  img = np.array(img.getdata(), np.uint8).reshape(img.size[1], img.size[0], 3)
end = time.time()
print(end - beg)

输出结果为4.015秒,也就是说截取一次屏幕需要半秒钟,更何况此处只截取了窗口的一部分矩形区域。所以ImageGrab模块能用是能用,就是有点慢。

三、使用Selenium截图

使用Selenium只能进行WEB程序截图

使用Selenium的各个浏览器需要制定驱动的位置,驱动下载地址参见Selenium 官网

from selenium import webdriver import time def capture(url, filename='capture.png'): browser = webdriver.Chrome(r'C:\Users\weidiao\Desktop\chromedriver_win32\chromedriver.exe') browser.set_window_size(1200, 900) browser.get(url) # Load page browser.execute_script(''' (function () { var y = 0; var step = 100; window.scroll(0, 0); function f() { if (y < document.body.scrollHeight) { y += step; window.scroll(0, y); setTimeout(f, 50); } else { window.scroll(0, 0); document.title += 'scroll-done'; } } setTimeout(f, 1000); })(); ''') for i in range(30): if 'scroll-done' in browser.title: break time.sleep(1) beg = time.time() for i in range(10): browser.save_screenshot(filename) end = time.time() print(end - beg) browser.close() capture('//www.jb51.net')

打印时间为3.033s,速度介于windows API和PIL ImageGrab模块之间。

ps:下面看下python基础===python实现截图

python实现全屏截图:

from PIL import ImageGrab
im = ImageGrab.grab()
im.save('F:\\12.png')

总结

以上所述是小编给大家介绍的Python实现屏幕截图的两种方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:
(0)

相关推荐

  • 在Windows下安装chromedriver

    在windows上安装 selenium 和 chromedriver 1 安装selenium 启动cmd命令行(同时按住windows键和R键,在对话框内输入cmd,然后回车) 安装seleniu ...

  • selenium+python自动化81-报告优化

    一. 优化html报告 为了满足小伙伴的各种变态需求,为了装逼提示逼格,为了让报告更加高大上,测试报告做了以下优化: - 测试报告中文显示,优化一些断言失败正文乱码问题 - 新增错误和失败截图,展示到 ...

  • 深入剖析Python最强大图片处理模块——Pillow

    前言 Pillow作为一个图片模块.可谓是真的简便强大,它的前身是PIL,后来将他取代,现在的pillow 可谓是一家独大,好了,让我们来看看他的具体用法. 今天我们介绍pillow 常用六大模块: ...

  • Selenium2+python自动化66-装饰器之运行失败截图

    前言 对于用例失败截图,很多小伙伴都希望在用例执行失败的时候能自动截图,想法是很好的,实现起来并不是那么容易. 这里分享下我的一些思路,当然目前还没找到完美的解决方案,我的思路是用装饰器去解决,希望有 ...

  • Selenium2+python自动化67-用例失败自动截图

    前言: 装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数 上一篇讲到用装饰器解决异常后自动截图,不过并没有与unittest结合,这篇把截图的装饰器改良了下,可以实现用例执行失败自动截图 ...

  • 普通人养老,我只推荐这两种方式

    一个老领导退休了,朋友们都替她觉得高兴,感觉她可以过自由自在的人生了,但是只有她自己知道,想要过自由自在的人生,难: 老领导在职的时候一个月二万多的收入呢,现在退休了,每个月只能领一千多的退休金,这个 ...

  • 战胜贪婪的两种方式——理性和果断止损!

    止损是期货投资者必备的交易技巧.对于新手来说,很多人认为,每个人都要先经历亏钱过程,然后才能到达成功的彼岸,而亏钱则是投资者所必须要缴纳的"学费".如果真是这样的话,笔者希望这个& ...

  • 两种方式解决居间费、服务费、劳务费等税负问题

    两种方式解决居间费.服务费.劳务费等税负问题 企业一般在正常的经营中不可避免的会与个人发生业务往来,其中最常见的就是居间服务费用,也就是咱们常说的"中介费用",而且一般来说中介费用 ...

  • 运动和读书,是让自己摆脱“丧穷衰老”的两种方式

    达芬奇曾说,运动是一切生命的源泉. 当一个人真正理解这句话的时候,应该是申琴那段忙得昏天暗地却还是坚持去健身房运动成功减了65斤的日子. 总有人说,每天上下班,哪里还有时间和精力运动,回家就躺在沙发里 ...

  • 变频器控制电机运行最常用的两种方式

    当变频器主电路接好电源线之后,要控制电动机的运行,还需要给有关端子接上外围接控制电路,并且将变频器的启动方式参数设为外部操作模式. 变频器控制电动机运转,常见的有两种方式,分别是开关控制方式和继电器控 ...

  • 获得加V认证一共有两种方式

    获得加V认证一共有两种方式,第一种方式就是平台去邀请的那些领域大咖们,他们自动的就加上,比如说演员,比如说教授,领域知名人物,这类是被邀请的明星或者网红,加V自然就非常容易. 第二类就是需要自己认证的 ...

  • 两性交往,这两种方式,容易将对方的感情抹除

    2015年,我一个人去北京的时候,我在北京街头遇上了一个人: 这个人在北京街头嚎啕大哭,后面有一个人去询问的时候才发现,原来这个人失恋了. 这个人表示自己之前和自己的女朋友关系特别的好,但是由于自己做 ...

  • 构造柱植筋和预留两种方式暗藏机密,搞懂了,为你的老板盈利更多

    构造柱植筋和预留两种方式暗藏机密,搞懂了,为你的老板盈利更多

  • colab中切换路径的两种方式

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/colab中切换路径的两种方式 作者:融水公子 rsgz Colab教程 Colab教程 http://www.rsgz.top/post/410 ...