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 相关文章推荐
数据挖掘之Apriori算法详解和Python实现代码分享
Nov 07 Python
Python魔术方法详解
Feb 14 Python
python获取目录下所有文件的方法
Jun 01 Python
python实现音乐下载器
Apr 15 Python
python3+PyQt5实现柱状图
Apr 24 Python
Python read函数按字节(字符)读取文件的实现
Jul 03 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
基于python实现把json数据转换成Excel表格
May 07 Python
用python批量移动文件
Jan 14 Python
Python 调用C++封装的进一步探索交流
Mar 04 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
杏林同学录(二)
2006/10/09 PHP
判断PHP数组是否为空的代码
2011/09/08 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
vue axios 表单提交上传图片的实例
2018/03/16 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
原生js+css实现tab切换功能
2020/09/17 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
Python脚本处理空格的方法
2016/08/08 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
python集合删除多种方法详解
2020/02/10 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
Python 中如何写注释
2020/08/28 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
应届生自我鉴定
2013/12/11 职场文书
个人收入证明范本
2014/01/12 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
Nginx解决403 forbidden的完整步骤
2021/04/01 Servers
浅谈mysql执行过程以及顺序
2021/05/12 MySQL