Python使用mss獲取窗口圖片的方法
您在使用mss時(shí)遇到的ModuleNotFoundError表明當(dāng)前環(huán)境未安裝該庫(kù)。以下是完整解決方案,包含安裝指導(dǎo)、代碼邏輯詳解及常見(jiàn)問(wèn)題處理:
1. 安裝依賴庫(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)窗口")
# 獲取窗口客戶區(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ū)域(精確到客戶區(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返回的是窗口外部矩形,包含非客戶區(qū)。 - 解決:使用
GetClientRect + ClientToScreen組合獲取客戶區(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("未找到記事本窗口")
# 獲取客戶區(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,邏輯類似:
# 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)文章
Python3中的最大整數(shù)和最大浮點(diǎn)數(shù)實(shí)例
今天小編就為大家分享一篇Python3中的最大整數(shù)和最大浮點(diǎn)數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
搭建pypi私有倉(cāng)庫(kù)實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了搭建pypi私有倉(cāng)庫(kù)實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
pandas實(shí)現(xiàn)數(shù)據(jù)concat拼接的示例代碼
pandas.concat用于合并DataFrame或Series,本文主要介紹了pandas實(shí)現(xiàn)數(shù)據(jù)concat拼接的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2025-06-06
Pandas數(shù)據(jù)操作及數(shù)據(jù)分析常用技術(shù)介紹
Pandas是Python中用于數(shù)據(jù)處理和數(shù)據(jù)分析的庫(kù),具有強(qiáng)大的數(shù)據(jù)操作和分析功能,包括數(shù)據(jù)清洗、轉(zhuǎn)換、篩選、聚合等。常用技術(shù)有數(shù)據(jù)讀取與寫(xiě)入、數(shù)據(jù)索引、數(shù)據(jù)切片、數(shù)據(jù)合并、數(shù)據(jù)透視表、數(shù)據(jù)可視化等,適用于各種數(shù)據(jù)分析和機(jī)器學(xué)習(xí)任務(wù)2023-04-04
Python中的“_args”和“__kwargs”用法詳解
*args 和 **kwargs 主要?于函數(shù)定義,你可以將不定數(shù)量的參數(shù)傳遞給?個(gè)函數(shù),這篇文章主要介紹了Python中的“_args”和“__kwargs”用法,需要的朋友可以參考下2023-01-01
用Python監(jiān)控NASA TV直播畫(huà)面的實(shí)現(xiàn)步驟
本文分享一個(gè)名為"Spacestills"的開(kāi)源程序,它可以用于查看 NASA TV 的直播畫(huà)面(靜止幀)2021-05-05

