python圖像模塊——從一張女神圖開始

零基礎python入門:從一個小程序開始續

上次我們用python完成了一個小任務:把一張200 * 200的圖片變成了100 * 100。

程序如下:

from PIL import Image

img = Image.open(/Users/wangrenjie/Documents/photo/photo.jpeg)

w, h = img.size

img.thumbnail((w//2,h/2))

img.save(/Users/wangrenjie/Documents/photo/thumbphoto.jpeg,jpeg)

不知道你注意沒有,這個小程序存在著很多問題,首先,如果我們選擇的圖片不存在會怎麼樣呢?

按照正常的邏輯,當我們沒有找到這張圖片的時候,我們應該停下這個程序的後續操作。那麼如何實現呢?這裡就需要使用判斷語法if.

if 顧名思義就是「是否」,那麼就是對後面的內容判斷,是真是假。在程序中,我 們對判斷的對象,是要求具有二象性的,也就是說它總是真或者就是假。通常我們用「1」來代表真,「0」代表假。這種變數還有另外一種稱呼就是布爾變數。bool值只有兩個「1」「0」。那麼當我們去尋找這張圖片之後,就要對其是否存在這個狀態進行判斷.可惜的是,當我們使用Image.open這個函數時,當我們直接對img 這個變數進行判斷時,發現

也就是說Image這個工具為我們完成了太多的操作,以至於它只能去打開一個必須存在的圖片,這在現實中是存在著邏輯的漏洞的,因為我們無法保證每次都有圖片存在。

所以我們要把這一步進行拆分,第一步我們需要去查找圖片是否存在,當存在的時候才會去利用Image.open進行操作。

值得欣慰的是,Image還提供了從文件IO獲取圖片。

這樣我們修改程序:

當圖片存在的時候,我們才會進行Image等操作,當打開文件失敗,就會拋出異常,而走到異常分支except,最後當我們完成操作的時候,需要走finally分支將數據流斷開,以免造成資源浪費和引入不確定的錯誤。

看到這裡,不知道你注意到沒有,這裡有幾個特殊的地方:

- 我們注意到這些代碼之間存在著不同的縮進。try,else等頂格寫,而分支下面的操作語句則縮進了四個空格。在python中縮進代表著代碼間的附屬關係,通常下一級要比上一級鎖進四個空格。4是怎麼來的呢?這是一個tab的長度,但是並不要因為是一個tab長度而隨便使用tab來縮緊,因為在很多編輯器裡面默認的tab很可能不是四個空格,需要你人工的設定。當然直接敲四個空格可能更準確但也更費時,所以寫代碼之前要確認好tab的長度。

- f= None 這是定義了一個變數,用於存儲接收到的文件數據。None在python代表著空值,但和我們常見的「NULL」和「0」還不一樣,在python中,認為所有的事物都是一個對象,也就是說python也是面向對象編程的。面向對象這個辭彙,看起來很難理解,但是聯繫實際,你可能會更容易理解,在現實中,我們接觸到的事物都是對象,所謂對象,就是一個由屬性和行為組成的完整個體,它應該具有完整的數據和對數據操作的函數。

- try-except-finally 控制塊,這在上面講述了各個分支的含義,try-else-finally控制塊,大多用於存在拋出異常操作的場景,這樣有助於避免因異常而導致程序出錯。記住:是必不可少的,這是開啟本分支操作的和區分關鍵字和操作字的分隔符。

在實際中我們可能需要大量進行讀寫,但是如果每次都是用try-else-finally控制塊,就顯得很不方便了。所以python提供了with - as語法。

使用with-as改寫上面的函數:

是不是變的更加的簡潔了呢?

這樣我們就可以把這個程序變得更加的健壯。


推薦閱讀:

R語言中不能進行深度學習?
python中的漢諾塔遞歸演算法的具體運算過程是怎樣的?
半小時自製自動郵件收作業系統
Python學到什麼樣子可以去找工作?
基於python的scrapy爬蟲,關於增量爬取是怎麼處理的?

TAG:Python | 自學編程 | 女神 |