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


Posted in Python onFebruary 05, 2018
  • 使用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("https://3water.com")

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

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

python实现全屏截图:

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

总结

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

Python 相关文章推荐
Python2.x利用commands模块执行Linux shell命令
Mar 11 Python
Python守护进程和脚本单例运行详解
Jan 06 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
python web框架 django wsgi原理解析
Aug 20 Python
解析python实现Lasso回归
Sep 11 Python
python getpass模块用法及实例详解
Oct 07 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
python实现canny边缘检测
Sep 14 Python
利用Pycharm连接服务器的全过程记录
Jul 01 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
Feb 05 #Python
用python实现对比两张图片的不同
Feb 05 #Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 #Python
Python安装模块的常见问题及解决方法
Feb 05 #Python
Python实现的用户登录系统功能示例
Feb 05 #Python
python中numpy的矩阵、多维数组的用法
Feb 05 #Python
NumPy 如何生成多维数组的方法
Feb 05 #Python
You might like
PHP实现分页的一个示例
2006/10/09 PHP
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
JavaScript中的事件处理
2008/01/16 Javascript
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
Nodejs实现批量下载妹纸图
2015/05/28 NodeJs
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
javascript实现简单页面倒计时
2021/03/02 Javascript
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
python控制台中实现进度条功能
2015/11/10 Python
Python中functools模块的常用函数解析
2016/06/30 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
python文本数据处理学习笔记详解
2019/06/17 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
pytorch实现线性拟合方式
2020/01/15 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
加拿大百叶窗和窗帘定制网站:Blinds
2017/01/30 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
开学典礼演讲稿
2014/05/23 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
2014年党小组工作总结
2014/12/20 职场文书
2015国庆66周年宣传语
2015/07/14 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书