用Python实现屏幕截图详解


Posted in Python onJanuary 22, 2022

一、序言

在csdn上有很多纯copy,这给我复现带来了很大的麻烦,所以我想根据我的个人找截图的经历记录下来,给未来的自己看,免得忘记了云云。
由于我比较喜欢用opencv处理图像,所以截屏最后都会附带一个使用opencv显示图片的一个步骤。

二、环境配置

1、下载pyautogui包

pip install pyautogui -i https://pypi.tuna.tsinghua.edu.cn/simple/

注:使用pyautogui方法获取截屏的话,只下载这个就行了

2、下载opencv-python包

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/

注:方便实现对图片的进一步处理,比如实时获取云云。

3、下载PyQt5包

pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/

注:使用PyQt方法截屏下载介个

4、下载pypiwin32包

pip install pypiwin32 -i https://pypi.tuna.tsinghua.edu.cn/simple/

注:使用PyQt方法截屏下载介个

三、屏幕截屏源码与解析

1、使用pyautogui方法实现截屏

import pyautogui
import cv2
import numpy as np

img = pyautogui.screenshot(region=[300,50, 200, 100])  # 分别代表:左上角坐标,宽高
#对获取的图片转换成二维矩阵形式,后再将RGB转成BGR
#因为imshow,默认通道顺序是BGR,而pyautogui默认是RGB所以要转换一下,不然会有点问题
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

cv2.imshow("截屏",img)
cv2.waitKey(0)

优点:

方便快捷,容易写核心部分就一行.速度快0.04s左右,基本可以达到实时截屏的效果。可以自由确定截屏区域

缺点:

但是不能指定获取程序的窗口,因此窗口也不能遮挡。 2、使用PyQt方法实现截屏 a.获取窗口的句柄,也就是目标窗口名title。

import win32gui

hwnd_title = dict() #创建字典保存窗口的句柄与名称映射关系


def get_all_hwnd(hwnd, mouse):
    if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
        hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})

win32gui.EnumWindows(get_all_hwnd, 0)

for h, t in hwnd_title.items():
    if t!= "":
        print(h, t)

注:程序会打印所有窗口的hwnd和title,有了title就可以进行截图了。

b.使用PyQt5截屏核心程序

from PyQt5.QtWidgets import QApplication
import win32gui
import sys
#这个是截取全屏的
hwnd = win32gui.FindWindow(None, 'C:/Windows/system32/cmd.exe')
app = QApplication(sys.argv)
screen = QApplication.primaryScreen()
img = screen.grabWindow(hwnd).toImage()
img.save("screenshot.jpg")

注:如果想截取特定的窗口,只需要将C:/Windows/system32/cmd.exe换成上一个程序中打印的title,并且保证那个窗口没有被你最小化即可

优点:

方便快捷,容易写核心部分就一行.速度快0.04s左右,基本可以达到实时截屏的效果。可以自由确定要截屏的窗口

缺点:

不可以自由确定截屏区域 c.使用PyQt5截屏用Mat格式显示的核心程序

def convertQImageToMat(incomingImage):
    '''  Converts a QImage into an opencv MAT format  '''
    # Format_RGB32 = 4,存入格式为B,G,R,A 对应 0,1,2,3
    # RGB32图像每个像素用32比特位表示,占4个字节,
    # R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个字节保留
    incomingImage = incomingImage.convertToFormat(4)
    width = incomingImage.width()
    height = incomingImage.height()

    ptr = incomingImage.bits()
    ptr.setsize(incomingImage.byteCount())
    arr = np.array(ptr).reshape(height, width, 4)  # Copies the data
    # arr为BGRA,4通道图片
    return arr

from PyQt5.QtWidgets import QApplication
import win32gui
import sys
import cv2
import numpy as np
hwnd = win32gui.FindWindow(None, '剑士之魂中文版小游戏,在线玩,4399小游戏 - 360安全浏览器 13.1')
app = QApplication(sys.argv)
screen = QApplication.primaryScreen()
img = screen.grabWindow(hwnd).toImage()

img=convertQImageToMat(img)#将获取的图像从QImage转换为RBG格式
cv2.imshow("asd",img)      #imshow
cv2.waitKey(0)

四、结语

我再查询了多个截屏的方法之后,发现就学会这两种截屏方法即可,所以就没有再放其他方法了

到此这篇关于用Python实现屏幕截图详解的文章就介绍到这了,更多相关Python屏幕截图内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
浅谈python中的正则表达式(re模块)
Oct 17 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
python爬取网页转换为PDF文件
Jun 07 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
python版百度语音识别功能
Jul 09 Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 Python
基于python实现蓝牙通信代码实例
Nov 19 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
Python+Appium新手教程
Apr 17 Python
python 破解加密zip文件的密码
Apr 22 Python
Python Pandas数据分析之iloc和loc的用法详解
Nov 11 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 #Python
django中websocket的具体使用
Jan 22 #Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 #Python
梳理总结Python开发中需要摒弃的18个坏习惯
Jan 22 #Python
Pandas搭配lambda组合使用详解
Jan 22 #Python
Python中的tkinter库简单案例详解
Jan 22 #Python
解析python中的jsonpath 提取器
Jan 18 #Python
You might like
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
json简单介绍
2008/06/10 Javascript
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
javascript常见用法总结
2014/05/22 Javascript
jQuery 选择器详解
2015/01/19 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
wxPython的安装图文教程(Windows)
2017/12/28 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
python异常触发及自定义异常类解析
2019/08/06 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
为什么称python为胶水语言
2020/06/16 Python
通俗讲解python 装饰器
2020/09/07 Python
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
环境建设实施方案
2014/03/14 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript