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 相关文章推荐
Python列表生成器的循环技巧分享
Mar 06 Python
Python日志模块logging简介
Apr 13 Python
Python中type的构造函数参数含义说明
Jun 21 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
python实现flappy bird游戏
Dec 24 Python
Python设计模式之外观模式实例详解
Jan 17 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
利用Python校准本地时间的方法教程
Oct 31 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
Python利器openpyxl之操作excel表格
Apr 17 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 Document 代码注释规范
2009/04/13 PHP
php正则表达式使用的详细介绍
2013/04/27 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
php实现设计模式中的单例模式详解
2014/10/11 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
模具专业毕业推荐信
2014/03/08 职场文书
Python进程池与进程锁之语法学习
2022/04/11 Python
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server
Golang入门之计时器
2022/05/04 Golang
一文搞懂Java中的注解和反射
2022/06/21 Java/Android