python學習——截圖工具編寫

學習一門語言最好的方法即是實踐,想要拿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

相關文章
相關標籤/搜索