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和GO语言实现的消息摘要算法示例
Mar 10 Python
浅谈Python中copy()方法的使用
May 21 Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
python+django加载静态网页模板解析
Dec 12 Python
python实现傅里叶级数展开的实现
Jul 21 Python
python实现点对点聊天程序
Jul 28 Python
Python变量访问权限控制详解
Jun 29 Python
python扫描线填充算法详解
Feb 19 Python
python计算导数并绘图的实例
Feb 29 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 Python
Python数据处理的三个实用技巧分享
Apr 01 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设计模式 State (状态模式)
2011/06/26 PHP
超级实用的7个PHP代码片段分享
2012/01/05 PHP
组合算法的PHP解答方法
2012/02/04 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
namespace.js Javascript的命名空间库
2011/10/11 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
JS查找字符串中出现次数最多的字符
2016/09/05 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
2020/07/31 Javascript
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
python类继承用法实例分析
2015/05/27 Python
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
Python selenium抓取微博内容的示例代码
2018/05/17 Python
Python跳出多重循环的方法示例
2019/07/03 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
python数据预处理方式 :数据降维
2020/02/24 Python
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
同居协议书范本
2014/04/23 职场文书
农村门前三包责任书
2014/07/25 职场文书
免职证明样本
2014/10/23 职场文书
小学运动会通讯稿
2015/07/18 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
Pandas数据类型之category的用法
2021/06/28 Python
python实现学员管理系统(面向对象版)
2022/06/05 Python