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如何读取MySQL数据库表数据
Mar 11 Python
机器学习python实战之手写数字识别
Nov 01 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
python 获取utc时间转化为本地时间的方法
Dec 31 Python
Python 从subprocess运行的子进程中实时获取输出的例子
Aug 14 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
python实现一个点绕另一个点旋转后的坐标
Dec 04 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 Python
python操作toml文件的示例代码
Nov 27 Python
Python文件名匹配与文件复制的实现
Dec 11 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 smarty 二级分类代码和模版循环例子
2011/06/16 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
jquery中获取select选中值的代码
2011/06/27 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
JS实现控制表格内指定单元格内容对齐的方法
2015/03/30 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
英国探险旅游专家:Explore
2018/12/20 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
资产评估专业大学生求职信
2013/09/29 职场文书
外贸业务员岗位职责
2013/11/24 职场文书
教师党性分析材料
2014/02/04 职场文书
战略合作协议书范本
2014/04/18 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
升职感谢信
2015/01/22 职场文书
数学备课组工作总结
2015/08/12 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL