PIL是一個功能非常強大的第三方圖像處理庫,它可以轉化圖像格式、創建縮略圖、顯示圖像、截取圖像、翻轉或旋轉圖片等等;原本PIL是隻支持python2的,後來出現了移植到python3的pillow,其功能與PIL相似,所以這裏需要注意。
一、安裝PIL
pip install pillow
我在安裝的時候出現了網絡延遲報錯等情況,總之鍥而不捨,多試幾次,或者換個時間再來,前提是命令不要出錯;
二、PIL的核心類——Image
Image是PIL的核心類,裏面存儲了PIL處理的必須參數和基礎方法,接下來我們就通過這個類對圖像進行初步處理;
- open(文件路徑)方法,返回一個圖片對象
from PIL import Image # 導入Image庫 img = Image.open('logo.png') # 打開圖像文件,返回Image對象 print(img) # 輸出文件對象信息 ''' PngImageFile 圖像格式 mode=1 色彩模式 size=1540x1540 圖像分辨率 ''' print('圖像格式:',img.format) print('圖像分辨率:',img.size) print('圖像模式:',img.mode) # 輸出結果: # <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=400x400 at 0x17066924F28> # # 圖像格式: PNG # # 圖像分辨率: (400, 400) # # 圖像模式: RGBA
從上面我們可以知道Image對象有format、size和mode三個屬性:
format屬性表示圖像的格式,我們常見的有JPG、PNG等
size屬性即爲圖片的分辨率,用像素表示
mode屬性定義了像素類型、顏色深度等等,這一塊涉及到的原型比較複雜,後面再慢慢理解,現在只需要知道的是:L表示灰度圖像、RGB表示真彩圖像、CMYK表示預先壓縮的圖像;上面的RGBA,最後的A表示Alpha(色彩空間)色彩模式 模式 說明 1 1位像素,非黑即白,沒有灰度之說,0表示黑,255表示白(一般來說我們生成的二維碼就是1模式);但是存儲佔用8Bit L 8位像素,與1模式相比,L模式有了灰度的變化,即可以表示黑白照片了;
RGB模式轉L模式公式(注意:最後會取整):R*0.299+G*0.587+B*0.114
P 8位像素,對應的顏色值是按照調色板查詢出來的,所以也可以使用調色板映射到其他模式 RGB 3*8位像素,真彩色圖像,用R、G、B三個通道組合而成,每隔通道用8Bit存儲,可理解成三原色模式
RGBA 4*8位像素,真彩色+透明通道,在RGB模式的基礎上加上了一個Alpha(透明通道),如果從RGB轉到RGBA,默認A爲255,即爲完全不透明 CMYK 4*8位像素,出版圖像,一般印刷用這個模式較多 YCbCr 3*8位像素,彩色視頻格式 I 32位整型灰度圖像,我們可以理解成,這個是L模式的進階版 F 32位浮點型像素,這個在I模式的基礎上保留了小數部分 - OK,講到這裏,有必要理解一下一張照片是怎麼顯示圖像的,我們先來看下下面這張圖片:
這是一張照片放大之後的截圖,我們可以看見放大之後流暢的線條消失了,取而代之的是一個一個小方塊,玩過我的世界的朋友可能知道,我的世界其實就是一個像素世界,所有的東西都是由方塊構成的;
那麼圖片也是一樣,它其實就是由一個一個小的像素點構成的,只不多我們現在的分辨率非常高,基本的1024*768,橫向有1024個像素點,縱向有768個像素點,縮小成一張照片,我們肉眼就很難分別了;
那麼每一個像素點都有一個值,我們最常使用的就是用RGB表示顏色,當這些顏色都鋪滿整個畫面的時候,就構成了一個圖像,這個就是圖像的顯示原理;
現在有一種隱寫術,就是可以用圖片作爲介質,隱藏我們需要保存的數據,他是怎麼實現的呢?我們知道一個像素點是由RGB三個通道構成,一個通道佔8bit,假設我將最後一位清空用於保存我們的數據,那麼一個1024*768的圖片就有1024*768*3=2,359,296bit的空間給我們保存數據,即可以保存1024*768*3/8/1024=288kb的數據;那麼這樣不會破壞原來的照片嘛,會,但是顏色的差別微乎其微,我們的肉眼根本分辨不出來,這樣我們就可以將信息以其他載體隱藏起來啦。 - show()方法,顯示圖像
這個方法非常簡單,會用系統默認圖片瀏覽器打開圖片; -
save(文件路徑,後綴名)方法,保存指定格式的圖像
將此圖像保存在給定的文件名下, 如果未指定格式,則儘可能使用文件名擴展名確定要使用的格式; -
transpose(翻轉模式)方法,翻轉圖像
通過原型,我們可以知道翻轉模式有以下幾種:
Image.FLIP_LEFT_RIGHT,表示將圖像左右翻轉
Image.FLIP_TOP_BOTTOM,表示將圖像上下翻轉
Image.ROTATE_90,表示將圖像逆時針旋轉90°
Image.ROTATE_180,表示將圖像逆時針旋轉180°
Image.ROTATE_270,表示將圖像逆時針旋轉270°
Image.TRANSPOSE,表示將圖像進行轉置(相當於順時針旋轉90°)
Image.TRANSVERSE,表示將圖像進行轉置,再水平翻轉
下面我們來看下效果: - thumbnail((尺寸),採樣算法) 創建縮略圖(注意:尺寸傳參的是元組)
這張照片的差別感覺不大,但是NEAREST採樣方式是最差的,默認使用的是BICUBIC,我們一般使用LANCZOS作爲我們的採樣算法,對於其中的差別,還是要多試,找到自己需求的那一個就好; - resize((尺寸),採樣算法) 調整圖片分辨率
這個方法跟thumbnail()的用法和功能還是非常相近,區別是:thumbnail()分辨率不能大於原分辨率,如果大於了也不會報錯,最按照原分辨率設置,resize()則沒有這個限制; - rotate(角度) 逆時針旋轉圖像到指定角度