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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
推荐11个实用Python库
Jan 23 Python
python里使用正则的findall函数的实例详解
Oct 19 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
Jun 19 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
在django模板中实现超链接配置
Aug 21 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
django实现将后台model对象转换成json对象并传递给前端jquery
Mar 16 Python
解决Python spyder显示不全df列和行的问题
Apr 20 Python
keras中的卷积层&amp;池化层的用法
May 22 Python
Python如何把十进制数转换成ip地址
May 25 Python
python turtle绘图命令及案例
Nov 23 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从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
PHP中list()函数用法实例简析
2016/01/08 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
cookie的secure属性详解
2015/04/08 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
python实现在pandas.DataFrame添加一行
2018/04/04 Python
pycharm创建一个python包方法图解
2019/04/10 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
python numpy存取文件的方式
2020/04/01 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
英国最大的正宗复古足球衫制造商和零售商:TOFFS
2018/06/21 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
文秘大学生求职信
2014/02/25 职场文书
企业法人授权委托书
2014/04/03 职场文书
《美丽的丹顶鹤》教学反思
2014/04/22 职场文书
服务之星事迹材料
2014/05/03 职场文书
医院党员公开承诺书
2014/08/30 职场文书
入党政审材料范文
2014/12/24 职场文书
政协常委会议主持词
2015/07/03 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
浅谈Redis中的RDB快照
2021/06/29 Redis
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL