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 timeimport win32gui, win32ui, win32con, win32apidef 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 timeimport numpy as npfrom PIL import ImageGrab# 每抓取一次屏幕需要的时间约为1s,如果图像尺寸小一些效率就会高一些beg = time.time()debug = Falsefor 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 webdriverimport timedef 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 ImageGrabim = 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 ...
随机推荐
- [Fatal Error] :3:13: Open quote is expected for attribute "{1}" associated with an element type "id".
用DOM解析XML时出现了如下错误: [Fatal Error] :3:13: Open quote is expected for attribute "{1}" associa ...
- mysql基础知识(2)
十 一.计算字段 计算字段通常需要使用 AS 来取别名,否则输出的时候字段名为计算表达式 select col1*col2 as col12 from mytable concat() 用于连接两个字 ...
- Redis注意事项
1.Redis3.0没有虚拟内存概念,已从2.4就移除: 2.redis挂掉并重启时,如果有主从备份的,主机挂掉重启时先关掉主从备份,不然从机的数据会被冲洗掉 数据恢复时如果有 AOF(原理是将Rei ...
- Mysql在linux下载、安装详情,附带mysql安装包路径
对mysql在linux的安装网上很多,但是都比较坑人,mysql的下载.到用什么包安装,安装过程没有具体解析 我最痛苦的其实是找安装包,建议找.tar.gz安装包比较好(下面我为同胞们找到了mysq ...
- java虚拟机学习-触摸java常量池(13-1)
java虚拟机学习-深入理解JVM(1) java虚拟机学习-慢慢琢磨JVM(2) java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制 java虚拟机学习-JVM内存管理:深 ...
- mac 上位Idea 配置Project SDK
问题 刚开始没有Project SDK 方法 添加SDK: /Library/Java/JavaVirtualMachines/jdkXYZ_VERSION.jdk/Contents/Home/jre ...
- Log4j和Log4j2的区别
Log4j是Apache的一个开源项目,我们不去考究它的起源时间,但是据我了解,log4j 1已经不再更新了. 下面我就以列举的方式来浅谈log4j和log4j 2的不同之处. 一.配置文件类型 lo ...
- (win10)Wamp环境下php升级至PHP7.2
(win10)Wamp环境下php升级至PHP7.2 ①下载php7.2到本地 链接:https://pan.baidu.com/s/16jqmF7GR_CRklHPAZ9VRrg 密码:4ob4 ② ...
- What is AMQP? and the architecture
What is AMQP? (Advanced Message Queuing Protocol) When two applications need to communicate there ar ...
- 用ASP.NET实现下载远程图片保存到本地的方法 保存抓取远程图片的方法
以下介绍两种方法:1.利用WebRequest,WebResponse 类WebRequest wreq=WebRequest.Create("http://files.jb51.net/f ...