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脚本来控制Windows Azure的简单教程
Apr 16 Python
Python入门_浅谈for循环、while循环
May 16 Python
python3 模拟登录v2ex实例讲解
Jul 13 Python
Python字典操作详细介绍及字典内建方法分享
Jan 04 Python
Python中多个数组行合并及列合并的方法总结
Apr 12 Python
Python读取本地文件并解析网页元素的方法
May 21 Python
解决python opencv无法显示图片的问题
Oct 28 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 Python
浅谈python多进程共享变量Value的使用tips
Jul 16 Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 Python
django中嵌套的try-except实例
May 21 Python
解决Pytorch中关于model.eval的问题
May 22 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
生成sessionid和随机密码的例子
2006/10/09 PHP
PHP新手上路(十一)
2006/10/09 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
PHP引用符&amp;的用法详细解析
2013/08/22 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
PHP判断JSON对象是否存在的方法(推荐)
2016/07/06 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
jQuery基于ID调用指定iframe页面内的方法
2016/07/06 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
介绍Python中的文档测试模块
2015/04/28 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
同学会邀请函模板
2015/01/30 职场文书
会计岗位职责范本
2015/04/02 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python