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 list使用示例 list中找连续的数字
Jan 27 Python
使用Python设置tmpfs来加速项目的教程
Apr 17 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
Python 字典与字符串的互转实例
Jan 13 Python
详解Python中 sys.argv[]的用法简明解释
Dec 20 Python
Django框架模板的使用方法示例
May 25 Python
Python socket 套接字实现通信详解
Aug 27 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
keras中的History对象用法
Jun 19 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
python 如何用map()函数创建多线程任务
Apr 07 Python
Python基础之进程详解
May 21 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 取得瑞年与平年的天数的代码
2009/08/10 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
PHP中if和or运行效率对比
2014/12/12 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
PHP+Ajax实现的检测用户名功能简单示例
2019/02/12 PHP
基于JQuery的6个Tab选项卡插件
2010/09/03 Javascript
javaScript同意等待代码实现心得
2011/01/01 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
js实现无缝轮播图特效
2020/05/09 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
在Python中使用Mako模版库的简单教程
2015/04/08 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
Django保护敏感信息的方法示例
2019/05/09 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
python将unicode和str互相转化的实现
2020/05/11 Python
keras打印loss对权重的导数方式
2020/06/10 Python
scrapy头部修改的方法详解
2020/12/06 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
英国女士家居服网站:hush
2017/08/09 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
中专生自我鉴定
2013/12/17 职场文书
写给女生的道歉信
2014/01/14 职场文书
干部作风建设工作总结
2014/10/29 职场文书
公司捐书倡议书
2015/04/27 职场文书
2019年入党思想汇报
2019/03/25 职场文书