學習一門語言最好的方法即是實踐,想要拿Python寫一個截圖工具,網上一搜資料果真已經不少,前輩們都已經作的很到位了。如今就一步步來學習一下:python
首先學習截圖整個桌面的方法,可使用Python中的PIL(Python Imaging Library)庫裏邊的ImageGrab.grab()函數來獲取截圖。而後使用save()函數將圖片保存下來。簡單的不能再簡單了,源碼以下:api
from PIL import ImageGrab pic = ImageGrab.grab() pic.save("D:\\picture.jpg")
這樣咱們即可以將整個桌面截圖保存在D盤根目錄下。So easy。另外關於圖片存儲格式,使用save()函數保存時路徑中文件格式爲jpg、bmp、png都可,親測可行,bmp格式存儲空間最大,理論上來講數據失真率也最低。函數
下面咱們考慮如何將當前窗口截圖保存,ImageGrab.grab()函數沒有參數時默認將整個屏幕截圖,當咱們給它傳遞一個矩形的座標時,它即可以將制定矩形進行截圖。同時這裏咱們須要在python中調用win32的GUI函數來獲取當前窗口的句柄、進而獲取當前窗口的位置座標。同時,咱們須要在python中定義一個結構體來存儲獲取的座標值,因而咱們又學習了python中結構體的定義以及win32 gui函數調用的方法,源碼以下:工具
import win32gui from ctypes import * import ctypes from PIL import ImageGrab import win32api,win32con import pyHook import pythoncom #定義結構體,存儲當前窗口座標 class RECT(ctypes.Structure): _fields_ = [('left', ctypes.c_int), ('top', ctypes.c_int), ('right', ctypes.c_int), ('bottom', ctypes.c_int)] rect = RECT() HWND = win32gui.GetForegroundWindow()#獲取當前窗口句柄 ctypes.windll.user32.GetWindowRect(HWND, ctypes.byref(rect))#獲取當前窗口座標 coordinate = (rect.left+2, rect.top+2, rect.right-2, rect.bottom-2)#轉換爲預截圖窗口座標 pic = ImageGrab.grab(coordinate)#截圖 pic.save("D:\\321.jpg")#保存
其中ctypes中的byref()方法是用來返回結構體的指針,從而將窗口座標存儲在結構體中。學習
在實現了全屏截圖以及指定窗口截圖之後,咱們便須要考慮如何實現指定範圍截圖。個人思路是利用pyHook工具包實現對鼠標事件的監聽,在鼠標左鍵按下時,記錄一個座標,鼠標左鍵擡起時再記錄一個座標,因而即可以肯定整個所要截圖區域的矩形座標,再使用ImageGrab.grab(coordinate)函數實現截圖。源碼以下:ui
coordinate = [1,1,1,1] #監聽鍵盤事件 def on_mouse_event(event): if event.MessageName == 'mouse left down': coordinate[0:2] = event.Position elif event.MessageName == 'mouse left up': coordinate[2:4] = event.Position win32api.PostQuitMessage()#退出監聽循環 pic = ImageGrab.grab(coordinate) pic.save("D:\\321.jpg") return True hm = pyHook.HookManager()#建立一個鉤子管理對象 hm.MouseAll = on_mouse_event#監聽全部鼠標事件 hm.HookMouse()#設定鼠標鉤子 pythoncom.PumpMessages()#進入循環,程序一直監聽
這裏咱們在鼠標完成截圖矩形座標肯定後,須要推出鼠標事件的監聽。另外,目前存在一個問題,在用鼠標選取範圍時會致使窗口焦點的改變,從而影響實際截圖內容。所以能夠進一步考慮先將屏幕鎖定,再進行範圍選定。或者也許能夠先進行全屏截圖,但僅顯示而不保存,在顯示的全屏截圖上再進行區域截圖。指針
恩,好了,一步步來,慢慢學習。菜鳥慢飛。code