python自动截屏然后处理图片,python实现屏幕截图
本文主要详细介绍了如何使用Python语言实现超快的窗口截图功能,可以自动获取当前活动窗口并显示截图。有兴趣的可以看看。
实现思路是先获取当前最顶层活动窗口的信息,再提取窗口的名称信息。
之后得到窗口的坐标信息,即左上角的起始坐标和右下角的结束坐标。最后直接截图,展示截图。
使用了win32gui和Pillow两个第三方模块。安装命令如下:
pip安装枕头
pip安装win32gui
导入其中使用的三个非标准库。
从win32gui导入* #操作windows窗口
从PIL导入ImageGrab #操作图像
Win32con #系统操作
初始化集合列表以存储所有活动窗口名。使用set类型的目的是确保所有活动窗口名称的唯一性。
names=set()
编写get_window_title函数来获取所有当前活动的窗口对象。
def get_window_title(窗口,nouse):
获取窗口标题功能
:参数窗口:窗口对象
:参数新值:
:返回:
if IsWindow(窗口)和IsWindowEnabled(窗口)和IsWindowVisible(窗口):
names.add(GetWindowText(window))
EnumWindows(get_window_title,0)
list _=[name for name in names if name]
对于list_:中的n
打印(“活动窗口:”,否)
输入要截图的窗口的名称作为当前窗口,然后提取要截图的窗口对象。
Name=input(请输入屏幕截图的活动窗口名称: \ n )
Window=FindWindow(0,name) #根据窗口名称获取窗口对象。
Show Window (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 )
打印(截图已保存!)
实现了上面的整个python截图操作。
补充
当然,在Python中实现窗口截图的方式更多。
方法一:使用pyautogui方法实现截屏。
导入pyautogui
导入cv2
将numpy作为np导入
Img=pyautogui .截图(region=[300,50,200,100]) #分别代表:左上角坐标,宽度,高度。
#将采集的图片转换成二维矩阵形式,然后将RGB转换成BGR。
#因为imshow,默认通道顺序是BGR,而pyautogui默认是RGB,所以需要转换,否则会有一些问题。
img=cv2 . CVT color(NP . as array(img),cv2。COLOR_RGB2BGR)
2.即时消息显示(“截图”,即时消息)
cv2.waitKey(0)
优点:
把核心部分写在一行,又快又简单。
li>速度快0.04s左右,基本可以达到实时截屏的效果。
缺点:
但是不能指定获取程序的窗口,因此窗口也不能遮挡。
方法二:使用PyQt方法实现截屏
a.获取窗口的句柄,也就是目标窗口名title
import win32guihwnd_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 QApplicationimport 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窗口截图内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。