基于Python实现窗口截图的思路和方法是什么
Admin 2022-09-02 群英技术资讯 1061 次浏览
这篇文章主要介绍了基于Python实现窗口截图的思路和方法是什么相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Python实现窗口截图的思路和方法是什么文章都会有所收获,下面我们一起来看看吧。实现思路是先获取到当前最上面活动的窗口信息,然后提取该窗口的名称信息。

之后获取窗口的坐标信息,即左上角的开始坐标及右下角的结束坐标。最后直接截图并将截图的图片进行展示。
其中用到了两个第三方模块,分别是win32gui和Pillow,安装命令如下:
pip install Pillow pip install win32gui
将其中使用到的三个非标准库导入进来。
from win32gui import * # 操作windows窗口 from PIL import ImageGrab # 操作图像 import win32con # 系统操作
初始化一个set列表存放所有活动窗口名称,使用set类型的目的是保证所有活动窗口名称的唯一性。
names = set()
编写get_window_title函数,获取当前的所有活动窗口对象。
def get_window_title(window, nouse):
'''
获取窗口标题函数
:param window: 窗口对象
:param nouse:
:return:
'''
if IsWindow(window) and IsWindowEnabled(window) and IsWindowVisible(window):
names.add(GetWindowText(window))
EnumWindows(get_window_title, 0)
list_ = [name for name in names if name]
for n in list_:
print('活动窗口: ', n)
输入自己想要截图的窗口名称作为当前窗口,然后提取到需要截图的窗口对象。
name = input('请输入需要截图的活动窗口名称: \n')
window = FindWindow(0, name) # 根据窗口名称获取窗口对象
ShowWindow(window, win32con.SW_MAXIMIZE) # 将该窗口最大化
获取该窗口的坐标信息,开始坐标信息和结束坐标信息。
x_start, y_start, x_end, y_end = GetWindowRect(window) # 坐标信息 box = (x_start, y_start, x_end, y_end)
调用ImageGrab.grab()函数实现对窗口的截图操作。
image = ImageGrab.grab(box)
在完成截图之后展示一下截图的效果,如果不需要展示的话就不需要添加这行代码了。
image.show() # 图片展示,如果截完图需要展示则放开此项
最后一步,将截图好的图片保存下来。
image.save('target.png')
print('截图已经保存完成!')
上面整个的python截图操作就实现了
补充
当然Python中还有更多方法实现窗口截图
方法一:使用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)
优点:
缺点:
但是不能指定获取程序的窗口,因此窗口也不能遮挡。
方法二:使用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)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家介绍了python数字图像处理之图像简单滤波实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
本篇文章给大家带来了关于Python3的相关知识,numpy里有一个非常神奇的函数叫做np.where()函数,下面这篇文章主要给大家介绍了关于Pythonnp.where()的详解以及代码应用的相
这篇文章主要为大家介绍了pytorch常用函数定义及resnet模型修改实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
本节介绍了 Python3 中的内置函数以及调试的两种方法。_来自Python3 教程,w3cschool编程狮。
本文主要介绍了Python手写回归树的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008