Python: 截屏


最近項目中想實現截屏功能,使用的筆記本是高清屏,實際屏幕設置成了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')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM