Python使用mss獲取窗口圖片的方法
您在使用mss時遇到的ModuleNotFoundError表明當(dāng)前環(huán)境未安裝該庫。以下是完整解決方案,包含安裝指導(dǎo)、代碼邏輯詳解及常見問題處理:
1. 安裝依賴庫(需在本地執(zhí)行)
pip install mss pywin32
2. 使用mss獲取窗口圖片的詳細步驟
步驟1:獲取窗口句柄及精確坐標(biāo)
import win32gui
from mss import mss
# 獲取窗口句柄
hwnd = win32gui.FindWindow(None, "記事本") # 替換為實際窗口標(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)換為屏幕絕對坐標(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(自動處理BGRA轉(zhuǎn)RGB)
sct_img = sct_img.convert("RGB")
sct_img.save("window_mss.png")
3. 關(guān)鍵問題處理
問題1:坐標(biāo)偏移(如標(biāo)題欄/邊框)
- 原因:
GetWindowRect返回的是窗口外部矩形,包含非客戶區(qū)。 - 解決:使用
GetClientRect + ClientToScreen組合獲取客戶區(qū)絕對坐標(biāo),確保截圖僅包含內(nèi)容區(qū)域。
問題2:DPI縮放導(dǎo)致尺寸錯誤
檢測方法:
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)整后的尺寸。
問題3:多顯示器坐標(biāo)系差異
- 驗證:使用
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. 跨平臺適配建議
macOS/Linux:使用Quartz或Xlib替代win32gui,邏輯類似:
# macOS示例(通過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. 驗證與調(diào)試技巧
- 坐標(biāo)驗證:使用
print(monitor)輸出截圖區(qū)域坐標(biāo),與實際窗口對比。 - 邊界測試:在純色桌面背景下測試,檢查截圖邊角是否與窗口邊緣對齊。
- 性能優(yōu)化:對于頻繁截圖場景,緩存窗口句柄和DPI值以減少重復(fù)計算。
通過上述方法,可徹底解決窗口截圖的位置偏差問題。如仍遇異常,建議使用pygetwindow庫輔助驗證窗口坐標(biāo),或通過pywin32的GetWindowPlacement進一步調(diào)試窗口狀態(tài)。
到此這篇關(guān)于Python使用mss獲取窗口圖片的方法的文章就介紹到這了,更多相關(guān)Python mss獲取窗口圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3中的最大整數(shù)和最大浮點數(shù)實例
今天小編就為大家分享一篇Python3中的最大整數(shù)和最大浮點數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
pandas實現(xiàn)數(shù)據(jù)concat拼接的示例代碼
pandas.concat用于合并DataFrame或Series,本文主要介紹了pandas實現(xiàn)數(shù)據(jù)concat拼接的示例代碼,具有一定的參考價值,感興趣的可以了解一下2025-06-06
Pandas數(shù)據(jù)操作及數(shù)據(jù)分析常用技術(shù)介紹
Pandas是Python中用于數(shù)據(jù)處理和數(shù)據(jù)分析的庫,具有強大的數(shù)據(jù)操作和分析功能,包括數(shù)據(jù)清洗、轉(zhuǎn)換、篩選、聚合等。常用技術(shù)有數(shù)據(jù)讀取與寫入、數(shù)據(jù)索引、數(shù)據(jù)切片、數(shù)據(jù)合并、數(shù)據(jù)透視表、數(shù)據(jù)可視化等,適用于各種數(shù)據(jù)分析和機器學(xué)習(xí)任務(wù)2023-04-04
Python中的“_args”和“__kwargs”用法詳解
*args 和 **kwargs 主要?于函數(shù)定義,你可以將不定數(shù)量的參數(shù)傳遞給?個函數(shù),這篇文章主要介紹了Python中的“_args”和“__kwargs”用法,需要的朋友可以參考下2023-01-01
用Python監(jiān)控NASA TV直播畫面的實現(xiàn)步驟
本文分享一個名為"Spacestills"的開源程序,它可以用于查看 NASA TV 的直播畫面(靜止幀)2021-05-05

