用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 相关文章推荐
python3+PyQt5重新实现自定义数据拖放处理
Apr 19 Python
python导入模块交叉引用的方法
Jan 19 Python
python list多级排序知识点总结
Oct 23 Python
python向图片里添加文字
Nov 26 Python
python3.8下载及安装步骤详解
Jan 15 Python
Python中pyecharts安装及安装失败的解决方法
Feb 18 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
Django实现前台上传并显示图片功能
May 29 Python
Python基于httpx模块实现发送请求
Jul 07 Python
python rsa-oaep加密的示例代码
Sep 23 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
全网非常详细的pytest配置文件
Jul 15 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的header和asp中的redirect比较
2006/10/09 PHP
PHP开发入门教程之面向对象
2006/12/05 PHP
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
javascript数组去重小结
2016/03/07 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
Vue.use源码分析
2017/04/22 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
JS对象与json字符串相互转换实现方法示例
2018/06/14 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
舞蹈教育学专业推荐信
2013/11/27 职场文书
学校十一活动方案
2014/02/01 职场文书
停电调休通知
2015/04/16 职场文书
公司开会通知
2015/04/20 职场文书
导游词之南京夫子庙
2019/12/09 职场文书
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android