Python实现屏幕截图的两种方式
Python实现屏幕截图的两种方式
- 使用windows API
- 使用PIL中的ImageGrab模块
下面对两者的特点和用法进行详细解释。
一、Python调用windows API实现屏幕截图
好处是
- 灵活
- 速度快
缺点是:
- 写法繁琐
- 不跨平台
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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模块
1
2
3
4
5
6
7
8
9
10
11
|
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 官网
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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( "//www.jb51.net" ) |
打印时间为3.033s,速度介于windows API和PIL ImageGrab模块之间。
ps:下面看下python基础===python实现截图
1
2
3
|
python实现全屏截图: from PIL import ImageGrab im = ImageGrab.grab() #可以添加一个坐标元组进去 im.save( 'F:\\12.png' ) |
Python实现屏幕截图的两种方式的更多相关文章
- day2 编程语言介绍、Python运行程序的两种方式、变量
一 编程语言介绍 1. 机器语言 用计算机能理解的二进制指令直接编写程序,直接控制硬件 2. 汇编语言 用英文标签取代二进制指令编写程序,本质也是直接控制硬件 3. 高级语言 用人能理解的表达方式去编 ...
- Python 输出百分比的两种方式
Python 输出百分比的两种方式 注: 在python3环境下测试. 方式1:直接使用参数格式化:{:.2%} {:.2%}: 显示小数点后2位 显示小数点后2位: >>> pri ...
- Python 发送 email 的两种方式
Python发送email的两种方式,分别为使用登录邮件服务器.调用sendmail命令来发送三种方法 Python发送email比较简单,可以通过登录邮件服务来发送,linux下也可以使用调用sen ...
- 【Python】Python figure显示的两种方式
1. 两种方式: 终端输出图像新窗口输出图像 2. 终端输出命令: %matplotlib inline 新窗口输出命令: %matplotlib qt5 注意此两个语句是命令行输入,若在spyder ...
- Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
实现抽象类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...
- python 字符编码的两种方式写法:# coding=utf-8和# -*- coding:utf-8 -*-
python运行文件是总会出现乱码问题,为了解决这个问题,在文件开头加上: # coding=utf-8 或者 # -*- coding:utf-8 -*- # coding=<encodin ...
- python 配置文件返回的两种方式,写法不一样而已
配置文件如下: [MODE]mode:{ "register":"all"} 或者 mode = {"register":"all ...
- python导入模块的两种方式
第一种 from support import * 这种方式导入后可以直接调用(有命名冲突问题)命名冲突后定义的覆盖前定义的 如果在函数导入前定义 则导入函数覆盖 否则相反 if __name__ = ...
- python创建进程的两种方式
1.方式1 import time import multiprocessing def task(arg): time.sleep(2) print(arg) def run(): # 进程1 p1 ...
随机推荐
- Java模式—简单工厂模式
简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式. 目的:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. ...
- vscode中PyLint报错Unable to import解决方案
在导入其它文件夹中py文件的时候,即使在代码中添加了指定路径,由于Pylint 无法检测到该文件,会给出Unable to import 'xxx'的错误提示 需要在项目目录下添加.pylintrc文 ...
- Ubuntu安装Gogs服务
花了半天的时间把阿里云的centos 换成了ubuntu 14.04 lts ,原因是因为我想安装个gogs git服务,但是centos的glibc版本太低,折腾了半天没有成功. 迁移Ghost数据 ...
- spring 资源访问
spring 资源访问 Resource resource=null; //访问网络资源 resource=new UrlResource("file:bool.xml"); // ...
- javascript 获取当前浏览器窗口宽高
获取当前浏览器窗口宽度:document.documentElement.clientWidth;获取当前浏览器窗口高度:document.documentElement.clientHeight; ...
- 图片按日期分类和查看程序(WPF开发)(附源码)
手机方便了我们的生活,可以随时随地拍摄.越来越多的图片堆砌在电脑里.看到杂乱无章的图片,实在感到头痛.手动整理太复杂.基于此,我写了一个小程序,可以将图片按日期整理和查看.按日期查看图片,回忆过去的点 ...
- Andrew Ng机器学习课程笔记(二)之逻辑回归
Andrew Ng机器学习课程笔记(二)之逻辑回归 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7364636.html 前言 ...
- 通过HttpServletRequest获取服务器路径
String scheme = request.getScheme(); String serverName = request.getServerName(); int port = request ...
- 深入Spring:自定义事务管理
转自: http://www.jianshu.com/p/5347a462b3a5 前言 上一篇文章讲了Spring的Aop,这里讲一下Spring的事务管理,Spring的事务管理是建立在Aop的基 ...
- java.rmi.server.ExportException: Port already in use: 1099; nested exception is
现象 mac上tomcat启动时报错: java.rmi.server.ExportException: Port already in use: 1099; nested exception is. ...