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' )
|
转载于:https://www.cnblogs.com/wutaotaosin/p/9719292.html
Python实现屏幕截图的两种方式相关推荐
- python扩展屏幕截图_Python实现屏幕截图的两种方式
Python实现屏幕截图的两种方式 使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处 ...
- python动态捕捉屏幕_Python实现屏幕截图的两种方式
使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处是 灵活 速度快 缺点是: 写法繁琐 ...
- Py之qrcode:调用python的qrcode库两种方式生成二维码、带logo的二维码
Py之qrcode:调用python的qrcode库两种方式生成二维码.带logo的二维码 目录 python编程实现生成二维码 1.第一种方式-纯文本 2.第二种方式-带logo
- 运用python的方式_对Python使用mfcc的两种方式详解
1.Librosa import librosa filepath = "/Users/birenjianmo/Desktop/learn/librosa/mp3/in.wav" ...
- Python图片裁剪的两种方式——Pillow和OpenCV
本文参考Python图片裁剪的两种方式--Pillow和OpenCV并进行了一些更新 感谢作者:hfutdog 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一 ...
- python解释器在哪里_详解查看Python解释器路径的两种方式
进入python的安装目录, 查看python解释器 进入bin目录 # ls python(看一下是否有python解释器版本) # pwd (查看当前目录) 复制当前目录即可 1. 通过脚本查看 ...
- python: 多线程实现的两种方式及让多条命令并发执行
一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading. ...
- 【Python】Python figure显示的两种方式
1. 两种方式: 终端输出图像 新窗口输出图像 2. 终端输出命令: %matplotlib inline 新窗口输出命令: %matplotlib qt5 注意此两个语句是命令行输入,若在spyde ...
- python程序执行的两种方式_012.执行Python程序的两种方式
一.执行Python程序的两种方式 1.1 交互式 在终端内输入python3,然后输入python代码 交互式环境下,敲完一条命令按下enter键马上能看到结果,调试程序方便.程序无法永久保存,关掉 ...
最新文章
- 初次体验hiphop-php
- 在SpringBoot项目中使用redis简单用法(一)
- LEMP+memcached
- 01_8_Struts用DomainModel接收参数
- 2018.12.30|区块链技术头条
- Wind7系统下 wifi设置
- cogs2514 艺术
- git tag — 标签相关操作
- matlab实现sift,SIFT算法的Matlab实现
- 用组合机床加工铸造模具
- 19年的两篇多标签文本分类 + 一篇层级多标签文本分类论文分享
- 迷你西游最新服务器是哪个,迷你西游公测新开服务器“万佛朝宗”公告
- 0day安全:软件漏洞分析技术(第2版)
- 供应链安全 | 北京大学软件工程国家工程研究中心 张世琨:软件供应链安全的风险和成因分析
- linux can总线接收数据串口打包上传_USART串口通讯
- 在 UltraEdit 或 UEStudio 中执行 DOS 或 Windows 命令
- 小猪的Python学习之旅 —— 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中
- 使markdown文档中的图片居中
- Win10系统卸载照片应用程序详细介绍
- WebRTC系列-Qos系列之发送NACK
热门文章
- cef异常处理_cef js异常
- 动态规划8FatMouse's Speed
- 软件工程复试面试问题总结(一)
- mysql的锁机制(读锁,写锁,表锁,行锁,悲观锁,乐观锁,间隙锁)
- php odbc连接池,修复︰ 使用连接池的 SQL Server ODBC 连接时设置的连接属性失败
- 图像增强工具Augmentor常用功能汇总
- 距离感应器下的休眠唤醒机制实现
- 漫画:二分解题模板(第一讲)- 修订版
- pymysql mysql 1064_python使用pymysql操作MySQL错误代码1054和1064处理
- mysql workbench 1064_mysql - MySQL Workbench错误1064 - 堆栈内存溢出