Python實現(xiàn)超快窗口截圖功能詳解
實現(xiàn)思路是先獲取到當前最上面活動的窗口信息,然后提取該窗口的名稱信息。
之后獲取窗口的坐標信息,即左上角的開始坐標及右下角的結束坐標。最后直接截圖并將截圖的圖片進行展示。
其中用到了兩個第三方模塊,分別是win32gui和Pillow,安裝命令如下:
pip install Pillow pip install win32gui
將其中使用到的三個非標準庫導入進來。
from win32gui import * # 操作windows窗口 from PIL import ImageGrab # 操作圖像 import win32con # 系統(tǒng)操作
初始化一個set列表存放所有活動窗口名稱,使用set類型的目的是保證所有活動窗口名稱的唯一性。
names = set()
編寫get_window_title函數(shù),獲取當前的所有活動窗口對象。
def get_window_title(window, nouse): ''' 獲取窗口標題函數(shù) :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) # 根據(jù)窗口名稱獲取窗口對象 ShowWindow(window, win32con.SW_MAXIMIZE) # 將該窗口最大化
獲取該窗口的坐標信息,開始坐標信息和結束坐標信息。
x_start, y_start, x_end, y_end = GetWindowRect(window) # 坐標信息 box = (x_start, y_start, x_end, y_end)
調(diào)用ImageGrab.grab()函數(shù)實現(xiàn)對窗口的截圖操作。
image = ImageGrab.grab(box)
在完成截圖之后展示一下截圖的效果,如果不需要展示的話就不需要添加這行代碼了。
image.show() # 圖片展示,如果截完圖需要展示則放開此項
最后一步,將截圖好的圖片保存下來。
image.save('target.png') print('截圖已經(jīng)保存完成!')
上面整個的python截圖操作就實現(xiàn)了
補充
當然Python中還有更多方法實現(xiàn)窗口截圖
方法一:使用pyautogui方法實現(xiàn)截屏
import pyautogui import cv2 import numpy as np img = pyautogui.screenshot(region=[300,50, 200, 100]) # 分別代表:左上角坐標,寬高 #對獲取的圖片轉(zhuǎn)換成二維矩陣形式,后再將RGB轉(zhuǎn)成BGR #因為imshow,默認通道順序是BGR,而pyautogui默認是RGB所以要轉(zhuǎn)換一下,不然會有點問題 img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) cv2.imshow("截屏",img) cv2.waitKey(0)
優(yōu)點:
- 方便快捷,容易寫核心部分就一行.
- 速度快0.04s左右,基本可以達到實時截屏的效果。
- 可以自由確定截屏區(qū)域
缺點:
但是不能指定獲取程序的窗口,因此窗口也不能遮擋。
方法二:使用PyQt方法實現(xiàn)截屏
a.獲取窗口的句柄,也就是目標窗口名title
import win32gui hwnd_title = dict() #創(chuàng)建字典保存窗口的句柄與名稱映射關系 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,并且保證那個窗口沒有被你最小化即可
優(yōu)點:
方便快捷,容易寫核心部分就一行.
速度快0.04s左右,基本可以達到實時截屏的效果。
可以自由確定要截屏的窗口
缺點:
不可以自由確定截屏區(qū)域
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個字節(jié), # R,G,B分量分別用8個bit表示,存儲順序為B,G,R,最后8個字節(jié)保留 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轉(zhuǎn)換為RBG格式 cv2.imshow("asd",img) #imshow cv2.waitKey(0)
到此這篇關于Python實現(xiàn)超快窗口截圖功能詳解的文章就介紹到這了,更多相關Python窗口截圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python解決非線性規(guī)劃中經(jīng)濟調(diào)度問題
Scipy是Python算法庫和數(shù)學工具包,包括最優(yōu)化、線性代數(shù)、積分、插值、特殊函數(shù)、傅里葉變換等模塊。scipy.optimize模塊中提供了多個用于非線性規(guī)劃問題的方法,適用于不同類型的問題。本文將利用起解決經(jīng)濟調(diào)度問題,感興趣的可以了解一下2022-05-05Python利用CNN實現(xiàn)對時序數(shù)據(jù)進行分類
這篇文章主要為大家詳細介紹了Python如何利用CNN實現(xiàn)對時序數(shù)據(jù)進行分類功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-02-02