用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用来获得图片exif信息的库实例分析
Mar 16 Python
Python的Django框架中模板碎片缓存简介
Jul 24 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
Oct 13 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
Mar 15 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
Python制作词云图代码实例
Sep 09 Python
Python编程快速上手——PDF文件操作案例分析
Feb 28 Python
Python 面向对象部分知识点小结
Mar 09 Python
django API 中接口的互相调用实例
Apr 01 Python
解决keras模型保存h5文件提示无此目录问题
Jul 01 Python
利用Python+OpenCV三步去除水印
May 28 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
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
php中将数组存到文件里的实现代码
2012/01/19 PHP
浅谈thinkphp的实例化模型
2015/01/04 PHP
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
JS中表单的使用小结
2014/01/11 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
Vue实现日历小插件
2019/06/26 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
Python采集腾讯新闻实例
2014/07/10 Python
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
Python中join函数简单代码示例
2018/01/09 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
django自定义模板标签过程解析
2019/12/14 Python
关于Python解包知识点总结
2020/05/05 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
高中同学聚会邀请函
2014/01/11 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
2015年党员承诺书
2015/01/21 职场文书
入伍通知书
2015/04/23 职场文书