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实现屏幕截图的代码及函数详解
Oct 01 Python
Python之自动获取公网IP的实例讲解
Oct 01 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
python多任务及返回值的处理方法
Jan 22 Python
pyhanlp安装介绍和简单应用
Feb 22 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
Python SELENIUM上传文件或图片实现过程
Oct 28 Python
Python笔记之观察者模式
Nov 20 Python
python实现同一局域网下传输图片
Mar 20 Python
Python urllib.request对象案例解析
May 11 Python
Python中logger日志模块详解
Aug 04 Python
Opencv python 图片生成视频的方法示例
Nov 18 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
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
基于jquery的图片懒加载js
2010/06/30 Javascript
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
预防网页挂马的方法总结
2016/11/03 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
JavaScript学习教程之cookie与webstorage
2019/06/23 Javascript
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
python实现将内容分行输出
2015/11/05 Python
举例简单讲解Python中的数据存储模块shelve的用法
2016/03/03 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
Python实现自动访问网页的例子
2020/02/21 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
简述 Python 的类和对象
2020/08/21 Python
中学教师岗位职责
2013/11/26 职场文书
教师师德反思材料
2014/02/15 职场文书
创意婚礼策划方案
2014/05/18 职场文书
客服专员岗位职责
2015/02/10 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
python 模拟在天空中放风筝的示例代码
2021/04/21 Python
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS