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之一个免费的实验室
Sep 14 Python
Python批量修改文本文件内容的方法
Apr 29 Python
Python正则表达式教程之一:基础篇
Mar 02 Python
用生成器来改写直接返回列表的函数方法
May 25 Python
详解python函数传参是传值还是传引用
Jan 16 Python
python使用turtle库绘制时钟
Mar 25 Python
Pandas之排序函数sort_values()的实现
Jul 09 Python
python基于TCP实现的文件下载器功能案例
Dec 10 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
jupyter notebook 实现matplotlib图动态刷新
Apr 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
php读取本地json文件的实例
2018/03/07 PHP
php中如何执行linux命令详解
2018/11/06 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
2012/03/01 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
Python os模块学习笔记
2015/06/21 Python
Python打印斐波拉契数列实例
2015/07/07 Python
Python实现字典依据value排序
2016/02/24 Python
Python实现基本线性数据结构
2016/08/22 Python
python tkinter窗口最大化的实现
2019/07/15 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
联想C++笔试题
2012/06/13 面试题
汽车检测与维修专业求职信
2013/10/30 职场文书
仓库保管员岗位职责
2013/12/20 职场文书
淘宝活动策划方案
2014/02/06 职场文书
化妆品促销方案
2014/02/24 职场文书
《梅花魂》教学反思
2014/04/30 职场文书
财务部副经理岗位职责范本
2014/06/17 职场文书
党员民主评议个人总结
2014/10/20 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技