用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 实现归并排序算法
Jun 05 Python
django rest framework之请求与响应(详解)
Nov 06 Python
Python实现的多叉树寻找最短路径算法示例
Jul 30 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
python+os根据文件名自动生成文本
Mar 21 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 Python
Python 用三行代码提取PDF表格数据
Oct 13 Python
Python实现微信好友的数据分析
Dec 16 Python
pyftplib中文乱码问题解决方案
Jan 11 Python
Tensorflow中的dropout的使用方法
Mar 13 Python
Python restful框架接口开发实现
Apr 13 Python
pycharm 2020 1.1的安装流程
Sep 29 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生成随机数或者字符串的代码
2008/09/05 PHP
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
PHP使用递归生成文章树
2015/04/21 PHP
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
nodejs结合socket.io实现websocket通信功能的方法
2018/01/12 NodeJs
Layer弹出层动态获取数据的方法
2018/08/20 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
安装python及pycharm的教程图解
2019/10/10 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
Python常用类型转换实现代码实例
2020/07/28 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
英语系本科生个人求职信
2013/09/21 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
工作分析计划书
2014/04/30 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
体育教师研修感悟
2015/11/18 职场文书