最近項目中想實現截屏功能,使用的筆記本是高清屏,實際屏幕設置成了150%,所以在截屏的時候遇到個各種問題。
最開始使用PIL ImageGrab來截取屏幕,如果本來是100%的設置沒有問題,能截取到全屏,但是150%或者其他設置的就會有問題,只能截取到屏幕的左上部分,無法截取到全屏。
from PIL import ImageGrab pic = ImageGrab.grab() # print(pic.size) pic.save(r'C:\Users\test\Desktop\Automation\python\pic.jpg')
但是這個問題很奇怪,也有的機器150%設置,但是執行后沒有問題。
遇到這個問題后看到網上有個解決方法:在注冊表中Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers添加python.exe和pythonw.exe路徑信息進去,再次執行程序就能截取到全屏,用python代碼添加注冊表的話,要重新再次運行程序才能截取到全屏:
from PIL import ImageGrab import winreg reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) key = winreg.OpenKey(reg, r'Control Panel\Desktop\WindowMetrics') # print(winreg.QueryValueEx(key, 'AppliedDPI')) if winreg.QueryValueEx(key, 'AppliedDPI')[0] != 96: key.Close() key = winreg.OpenKey(reg, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers', 0, winreg.KEY_ALL_ACCESS) winreg.SetValueEx(key, r'C:\Users\test\AppData\Local\Continuum\anaconda3\pythonw.exe', 0, winreg.REG_SZ, 'HIGHDPIAWARE') winreg.SetValueEx(key, r'C:\Users\test\AppData\Local\Continuum\anaconda3\python.exe', 0, winreg.REG_SZ, 'HIGHDPIAWARE') key.Close() reg.Close() pic = ImageGrab.grab() # print(pic.size) pic.save(r'C:\Users\test\Desktop\Automation\python\pic.jpg')
考慮到以后會用到其他機器上,每次都需要執行2次才能截取到全屏,就棄用了此方法。
后來使用pyautogui來截取全屏,一般沒有安裝pyautogui,需要先安裝:
pip install pyautogui
import pyautogui img = pyautogui.screenshot() img.save(r'C:\Users\test\Desktop\Automation\python\pic_pyautogui.jpg')
但是如果筆記本還有連接外接顯示器,是截取不到外顯上內容的,只能截取筆記本顯示器上的內容。如果要截取到外顯上內容,想到使用win32方法來實現按鍵盤上的截屏功能,從而來實現抓取全屏帶外顯內容:
import win32api import win32con from PIL import ImageGrab win32api.keybd_event(win32con.VK_SNAPSHOT, 0) im = ImageGrab.grabclipboard() im.save(r'C:\Users\test\Desktop\Automation\python\pic_screenshot.jpg')