Python使用mss獲取窗口圖片的方法
您在使用mss時(shí)遇到的ModuleNotFoundError表明當(dāng)前環(huán)境未安裝該庫(kù)。以下是完整解決方案,包含安裝指導(dǎo)、代碼邏輯詳解及常見(jiàn)問(wèn)題處理:
1. 安裝依賴(lài)庫(kù)(需在本地執(zhí)行)
pip install mss pywin32
2. 使用mss獲取窗口圖片的詳細(xì)步驟
步驟1:獲取窗口句柄及精確坐標(biāo)
import win32gui
from mss import mss
# 獲取窗口句柄
hwnd = win32gui.FindWindow(None, "記事本") # 替換為實(shí)際窗口標(biāo)題
if hwnd == 0:
raise Exception("未找到目標(biāo)窗口")
# 獲取窗口客戶(hù)區(qū)坐標(biāo)(排除標(biāo)題欄/邊框)
left, top, right, bot = win32gui.GetClientRect(hwnd)
win32gui.ClientToScreen(hwnd, (left, top)) # 轉(zhuǎn)換為屏幕絕對(duì)坐標(biāo)
步驟2:配置mss截圖參數(shù)
with mss() as sct:
# 定義截圖區(qū)域(精確到客戶(hù)區(qū))
monitor = {
"left": left,
"top": top,
"width": right - left,
"height": bot - top
}
# 捕獲屏幕區(qū)域
sct_img = sct.grab(monitor)
# 保存為PNG(自動(dòng)處理BGRA轉(zhuǎn)RGB)
sct_img = sct_img.convert("RGB")
sct_img.save("window_mss.png")
3. 關(guān)鍵問(wèn)題處理
問(wèn)題1:坐標(biāo)偏移(如標(biāo)題欄/邊框)
- 原因:
GetWindowRect返回的是窗口外部矩形,包含非客戶(hù)區(qū)。 - 解決:使用
GetClientRect + ClientToScreen組合獲取客戶(hù)區(qū)絕對(duì)坐標(biāo),確保截圖僅包含內(nèi)容區(qū)域。
問(wèn)題2:DPI縮放導(dǎo)致尺寸錯(cuò)誤
檢測(cè)方法:
from ctypes import windll dpi = windll.user32.GetDpiForWindow(hwnd) scale = dpi / 96.0 # 96為基準(zhǔn)DPI adjusted_width = int((right - left) * scale)
處理:在monitor字典中使用調(diào)整后的尺寸。
問(wèn)題3:多顯示器坐標(biāo)系差異
- 驗(yàn)證:使用
ctypes.windll.user32.GetMonitorInfo獲取顯示器物理范圍。 - 示例:
monitor_info = {}
ctypes.windll.user32.GetMonitorInfoA(ctypes.windll.user32.MonitorFromWindow(hwnd, 1), ctypes.byref(monitor_info))
print("顯示器工作區(qū):", monitor_info["rcWork"])
4. 完整修正代碼
import win32gui
from mss import mss
import ctypes
# 獲取窗口句柄
hwnd = win32gui.FindWindow(None, "記事本")
if hwnd == 0:
raise Exception("未找到記事本窗口")
# 獲取客戶(hù)區(qū)坐標(biāo)
left, top, right, bot = win32gui.GetClientRect(hwnd)
win32gui.ClientToScreen(hwnd, (left, top))
# 處理DPI縮放
dpi = ctypes.windll.user32.GetDpiForWindow(hwnd)
scale = dpi / 96.0
adjusted_left = int(left * scale)
adjusted_top = int(top * scale)
width = int((right - left) * scale)
height = int((bot - top) * scale)
# 使用mss截圖
with mss() as sct:
monitor = {
"left": adjusted_left,
"top": adjusted_top,
"width": width,
"height": height
}
sct_img = sct.grab(monitor)
sct_img = sct_img.convert("RGB") # 轉(zhuǎn)換顏色格式
sct_img.save("corrected_window.png")
print("截圖已保存,尺寸:{}x{}".format(width, height))
5. 跨平臺(tái)適配建議
macOS/Linux:使用Quartz或Xlib替代win32gui,邏輯類(lèi)似:
# macOS示例(通過(guò)Quartz獲取窗口ID)
from Quartz import CGWindowListCopyWindowInfo
windows = CGWindowListCopyWindowInfo(kCGWindowListOptionAll)
target_window = [w for w in windows if "記事本" in w.get("kCGWindowName", "")][0]
bounds = target_window["kCGWindowBounds"]
6. 驗(yàn)證與調(diào)試技巧
- 坐標(biāo)驗(yàn)證:使用
print(monitor)輸出截圖區(qū)域坐標(biāo),與實(shí)際窗口對(duì)比。 - 邊界測(cè)試:在純色桌面背景下測(cè)試,檢查截圖邊角是否與窗口邊緣對(duì)齊。
- 性能優(yōu)化:對(duì)于頻繁截圖場(chǎng)景,緩存窗口句柄和DPI值以減少重復(fù)計(jì)算。
通過(guò)上述方法,可徹底解決窗口截圖的位置偏差問(wèn)題。如仍遇異常,建議使用pygetwindow庫(kù)輔助驗(yàn)證窗口坐標(biāo),或通過(guò)pywin32的GetWindowPlacement進(jìn)一步調(diào)試窗口狀態(tài)。
到此這篇關(guān)于Python使用mss獲取窗口圖片的方法的文章就介紹到這了,更多相關(guān)Python mss獲取窗口圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
多版本python的pip 升級(jí)后, pip2 pip3 與python版本失配解決方法
在本篇文章里小編給大家整理的是關(guān)于多版本python的pip 升級(jí)后, pip2 pip3 與python版本失配的解決方法內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-09-09
Python面向?qū)ο髮?shí)現(xiàn)方法總結(jié)
這篇文章主要介紹了Python面向?qū)ο髮?shí)現(xiàn)方法總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Python Selenium中常用的元素定位方法總結(jié)
在Web自動(dòng)化測(cè)試中,元素定位是一項(xiàng)非常重要的技術(shù),Python Selenium提供了各種元素定位方法,可以幫助我們定位頁(yè)面上的元素并與之交互,本文將詳細(xì)介紹Python Selenium中常用的元素定位方法,并提供實(shí)例代碼,需要的朋友可以參考下2023-11-11
Python OpenCV實(shí)現(xiàn)視頻追蹤
這篇文章主要為大家詳細(xì)介紹了Python OpenCV實(shí)現(xiàn)視頻追蹤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
django實(shí)現(xiàn)將后臺(tái)model對(duì)象轉(zhuǎn)換成json對(duì)象并傳遞給前端jquery
這篇文章主要介紹了django實(shí)現(xiàn)將后臺(tái)model對(duì)象轉(zhuǎn)換成json對(duì)象并傳遞給前端jquery,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
使用Keras訓(xùn)練好的.h5模型來(lái)測(cè)試一個(gè)實(shí)例
這篇文章主要介紹了使用Keras訓(xùn)練好的.h5模型來(lái)測(cè)試一個(gè)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
Python簡(jiǎn)單實(shí)現(xiàn)子網(wǎng)掩碼轉(zhuǎn)換的方法
這篇文章主要介紹了Python簡(jiǎn)單實(shí)現(xiàn)子網(wǎng)掩碼轉(zhuǎn)換的方法,涉及Python字符串相關(guān)操作技巧,需要的朋友可以參考下2016-04-04
Conda虛擬環(huán)境的復(fù)制和遷移的四種方法實(shí)現(xiàn)
本文主要介紹了Conda虛擬環(huán)境的復(fù)制和遷移的四種方法實(shí)現(xiàn),包括requirements.txt,environment.yml,conda-pack,直接復(fù)制envs目錄,各方法適用于不同場(chǎng)景,需根據(jù)需求選擇2025-06-06

