Python實(shí)現(xiàn)超快窗口截圖功能詳解
實(shí)現(xiàn)思路是先獲取到當(dāng)前最上面活動(dòng)的窗口信息,然后提取該窗口的名稱(chēng)信息。

之后獲取窗口的坐標(biāo)信息,即左上角的開(kāi)始坐標(biāo)及右下角的結(jié)束坐標(biāo)。最后直接截圖并將截圖的圖片進(jìn)行展示。
其中用到了兩個(gè)第三方模塊,分別是win32gui和Pillow,安裝命令如下:
pip install Pillow pip install win32gui
將其中使用到的三個(gè)非標(biāo)準(zhǔn)庫(kù)導(dǎo)入進(jìn)來(lái)。
from win32gui import * # 操作windows窗口 from PIL import ImageGrab # 操作圖像 import win32con # 系統(tǒng)操作
初始化一個(gè)set列表存放所有活動(dòng)窗口名稱(chēng),使用set類(lèi)型的目的是保證所有活動(dòng)窗口名稱(chēng)的唯一性。
names = set()
編寫(xiě)get_window_title函數(shù),獲取當(dāng)前的所有活動(dòng)窗口對(duì)象。
def get_window_title(window, nouse):
'''
獲取窗口標(biāo)題函數(shù)
:param window: 窗口對(duì)象
: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('活動(dòng)窗口: ', n)
輸入自己想要截圖的窗口名稱(chēng)作為當(dāng)前窗口,然后提取到需要截圖的窗口對(duì)象。
name = input('請(qǐng)輸入需要截圖的活動(dòng)窗口名稱(chēng): \n')
window = FindWindow(0, name) # 根據(jù)窗口名稱(chēng)獲取窗口對(duì)象
ShowWindow(window, win32con.SW_MAXIMIZE) # 將該窗口最大化
獲取該窗口的坐標(biāo)信息,開(kāi)始坐標(biāo)信息和結(jié)束坐標(biāo)信息。
x_start, y_start, x_end, y_end = GetWindowRect(window) # 坐標(biāo)信息 box = (x_start, y_start, x_end, y_end)
調(diào)用ImageGrab.grab()函數(shù)實(shí)現(xiàn)對(duì)窗口的截圖操作。
image = ImageGrab.grab(box)
在完成截圖之后展示一下截圖的效果,如果不需要展示的話(huà)就不需要添加這行代碼了。
image.show() # 圖片展示,如果截完圖需要展示則放開(kāi)此項(xiàng)
最后一步,將截圖好的圖片保存下來(lái)。
image.save('target.png')
print('截圖已經(jīng)保存完成!')
上面整個(gè)的python截圖操作就實(shí)現(xiàn)了
補(bǔ)充
當(dāng)然Python中還有更多方法實(shí)現(xiàn)窗口截圖
方法一:使用pyautogui方法實(shí)現(xiàn)截屏
import pyautogui
import cv2
import numpy as np
img = pyautogui.screenshot(region=[300,50, 200, 100]) # 分別代表:左上角坐標(biāo),寬高
#對(duì)獲取的圖片轉(zhuǎn)換成二維矩陣形式,后再將RGB轉(zhuǎn)成BGR
#因?yàn)閕mshow,默認(rèn)通道順序是BGR,而pyautogui默認(rèn)是RGB所以要轉(zhuǎn)換一下,不然會(huì)有點(diǎn)問(wèn)題
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
cv2.imshow("截屏",img)
cv2.waitKey(0)
優(yōu)點(diǎn):
- 方便快捷,容易寫(xiě)核心部分就一行.
- 速度快0.04s左右,基本可以達(dá)到實(shí)時(shí)截屏的效果。
- 可以自由確定截屏區(qū)域
缺點(diǎn):
但是不能指定獲取程序的窗口,因此窗口也不能遮擋。
方法二:使用PyQt方法實(shí)現(xiàn)截屏
a.獲取窗口的句柄,也就是目標(biāo)窗口名title
import win32gui
hwnd_title = dict() #創(chuàng)建字典保存窗口的句柄與名稱(chēng)映射關(guān)系
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)
注:程序會(huì)打印所有窗口的hwnd和title,有了title就可以進(jìn)行截圖了。
b.使用PyQt5截屏核心程序
from PyQt5.QtWidgets import QApplication
import win32gui
import sys
#這個(gè)是截取全屏的
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換成上一個(gè)程序中打印的title,并且保證那個(gè)窗口沒(méi)有被你最小化即可
優(yōu)點(diǎn):
方便快捷,容易寫(xiě)核心部分就一行.
速度快0.04s左右,基本可以達(dá)到實(shí)時(shí)截屏的效果。
可以自由確定要截屏的窗口
缺點(diǎn):
不可以自由確定截屏區(qū)域
c.使用PyQt5截屏用Mat格式顯示的核心程序
def convertQImageToMat(incomingImage):
''' Converts a QImage into an opencv MAT format '''
# Format_RGB32 = 4,存入格式為B,G,R,A 對(duì)應(yīng) 0,1,2,3
# RGB32圖像每個(gè)像素用32比特位表示,占4個(gè)字節(jié),
# R,G,B分量分別用8個(gè)bit表示,存儲(chǔ)順序?yàn)锽,G,R,最后8個(gè)字節(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)
到此這篇關(guān)于Python實(shí)現(xiàn)超快窗口截圖功能詳解的文章就介紹到這了,更多相關(guān)Python窗口截圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 矩陣轉(zhuǎn)置的幾種方法小結(jié)
今天小編就為大家分享一篇Python 矩陣轉(zhuǎn)置的幾種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python實(shí)現(xiàn)快速傅里葉變換的方法(FFT)
這篇文章主要介紹了Python實(shí)現(xiàn)快速傅里葉變換的方法(FFT),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Python使用Matplotlib繪制散點(diǎn)趨勢(shì)線的代碼詳解
Matplotlib是一個(gè)用于數(shù)據(jù)可視化的強(qiáng)大Python庫(kù),其基本功能之一是創(chuàng)建帶有趨勢(shì)線的散點(diǎn)圖,散點(diǎn)圖對(duì)于可視化變量之間的關(guān)系非常有用,本文將指導(dǎo)您使用Matplotlib繪制散點(diǎn)趨勢(shì)線的過(guò)程,涵蓋線性和多項(xiàng)式趨勢(shì)線,需要的朋友可以參考下2025-01-01
Python臨時(shí)文件創(chuàng)建之tempfile模塊介紹
這篇文章主要介紹了Python臨時(shí)文件創(chuàng)建之tempfile模塊,Python的tempfile模塊是用來(lái)創(chuàng)建臨時(shí)文件或者文件夾的跨平臺(tái)工具,下面關(guān)于模塊簡(jiǎn)單介紹需要的小伙伴可以參考一下2022-03-03

