用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实现检测服务器是否可以ping通的2种方法
Jan 01 Python
go语言计算两个时间的时间差方法
Mar 13 Python
浅谈Python peewee 使用经验
Oct 20 Python
Python IDLE入门简介
Dec 08 Python
Python实现简易版的Web服务器(推荐)
Jan 29 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
May 04 Python
Python做智能家居温湿度报警系统
Sep 25 Python
详解python多线程之间的同步(一)
Apr 03 Python
python+selenium 点击单选框-radio的实现方法
Sep 03 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
浅谈Python爬虫原理与数据抓取
Jul 21 Python
python中子类与父类的关系基础知识点
Feb 02 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网上调查系统
2006/10/09 PHP
php代码运行时间查看类代码分享
2011/08/06 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
浅谈php7的重大新特性
2015/10/23 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
Python greenlet实现原理和使用示例
2014/09/24 Python
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
分享几道你可能遇到的python面试题
2017/07/24 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
python中类的属性和方法介绍
2018/11/27 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
数学系毕业生的自我评价
2014/01/10 职场文书
大学生求职自我评价
2014/01/16 职场文书
办公室员工岗位工作职责
2014/03/10 职场文书
《新型玻璃》教学反思
2014/04/13 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书