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构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
跟老齐学Python之print详解
Sep 28 Python
python OpenCV学习笔记实现二维直方图
Feb 08 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
python将list转为matrix的方法
Dec 12 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
python并发编程多进程 模拟抢票实现过程
Aug 20 Python
python3 pillow模块实现简单验证码
Oct 31 Python
Python 限定函数参数的类型及默认值方式
Dec 24 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
详解Python小数据池和代码块缓存机制
Apr 07 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 Ajax实现页面无刷新发表评论
2007/01/02 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
对象的类型:本地对象(1)
2006/12/29 Javascript
javaScript 关闭浏览器 (不弹出提示框)
2010/01/31 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
js闭包的用途详解
2014/11/09 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
python实现排序算法
2014/02/14 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
python程序文件扩展名知识点详解
2020/02/27 Python
详解python polyscope库的安装和例程
2020/11/13 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
使用html5制作loading图的示例
2014/04/14 HTML / CSS
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
Bloomingdale’s阿联酋:选购奢华时尚、美容及更多
2020/09/22 全球购物
廉洁使者实施方案
2014/03/29 职场文书
我爱祖国演讲稿
2014/09/02 职场文书