用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 fileinput模块使用实例
Jun 03 Python
理解python正则表达式
Jan 15 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
Python学生成绩管理系统简洁版
Apr 05 Python
彻彻底底地理解Python中的编码问题
Oct 15 Python
Python中的asyncio代码详解
Jun 10 Python
Django 请求Request的具体使用方法
Nov 11 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
Python参数传递实现过程及原理详解
May 14 Python
Django admin组件的使用
Oct 24 Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 Python
TensorFlow中tf.batch_matmul()的用法
Jun 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反转字符串函数strrev()函数的用法
2012/02/04 PHP
php定时执行任务设置详解
2015/02/06 PHP
php中return的用法实例分析
2015/02/28 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
jQuery Tools tab使用介绍
2012/07/14 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
教你用十行node.js代码读取docx的文本
2017/03/08 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
原生JS实现天气预报
2020/06/16 Javascript
Python的randrange()方法使用教程
2015/05/15 Python
python字典的常用操作方法小结
2016/05/16 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
2018/01/08 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
python生成任意频率正弦波方式
2020/02/25 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
运动会稿件300字
2014/02/14 职场文书
手术室护士节演讲稿
2014/08/27 职场文书
政府个人对照检查材料思想汇报
2014/10/08 职场文书
2015年秋学期教研工作总结
2015/10/14 职场文书
《落花生》教学反思
2016/02/16 职场文书
java泛型通配符详解
2021/07/25 Java/Android
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS
css3 选择器
2022/05/11 HTML / CSS