2021-05-12 14:32:11
Python Pillow(PIL)庫的用法詳解
Pillow庫是一個Python的第三方庫。
在Python2中,PIL(Python Imaging Library)是一個非常好用的影象處理庫,但PIL不支援Python3,所以有人(Alex Clark和Contributors)提供了Pillow,可以在Python3中使用。
官方檔案路徑:https://pillow.readthedocs.io/en/latest/
一、安裝Pillow
pip install pillow
Pillow庫安裝成功後,導包時要用PIL來匯入,而不能用pillow或Pillow。
import PIL from PIL import Image
在Pillow庫中,有二十多個模組,還支援非常多的外掛。其中最常用的是Image模組中同名的Image類,其他很多模組都是在Image模組的基礎上對影象做進一步的特殊處理。本文主要介紹Image模組的常用用法,其他的模組可以按需看檔案。
二、開啟本地圖片
# coding=utf-8 from PIL import Image image = Image.open("yazi.jpg") image.show()
執行結果:
open(fp, mode='r'): 開啟一張圖片,如果圖片與當前程式碼在同一目錄下,可以只寫圖片的檔名,其他情況需要拼接圖片的路徑。mode預設為'r',也必須為'r'。
show(): 呼叫圖片顯示軟體開啟圖片。開啟後程式會阻塞,需要手動關閉。
三、建立一張新圖片
from PIL import Image image = Image.new('RGB', (160, 90), (0, 0, 255)) image.show()
執行結果:
new(mode, size, color=0): 建立一張圖片(畫布),用於繪圖,有3個引數。
mode, 圖片的模式,如「RGB」(red,green,blue三原色的縮寫,表示真彩色影象)、「L」(灰度,黑白影象)等。
size, 圖片的大小。是一個長度為2的元組(width, height),表示的是畫素大小。
color, 圖片的顏色,預設值為0表示黑色。可以傳入長度為3的元組表示顏色,也可以傳入顏色的十六進位制,在版本1.1.4後,還可以直接傳入顏色的英文單詞,如上面程式碼中的(0, 0, 255)可以換成‘#0000FF'或‘blue',都是表示藍色。
四、Image模組的常用屬性
from PIL import Image image = Image.open("yazi.jpg") print('width: ', image.width) print('height: ', image.height) print('size: ', image.size) print('mode: ', image.mode) print('format: ', image.format) print('category: ', image.category) print('readonly: ', image.readonly) print('info: ', image.info)
執行結果:
width: 1557
height: 911
size: (1557, 911)
mode: RGBA
format: jpg
category: 0
readonly: 1
width屬性表示圖片的畫素寬度,height屬性表示圖片的畫素高度,width和height組成了size屬性,size是一個元組。
mode屬性表示圖片的模式,如RGBA,RGB,P,L等。
format屬性表示圖片的格式,格式一般與圖片的字尾擴充套件名相關。category屬性表示圖片的的類別。
readonly屬性表述圖片是否為唯讀,值為1或0,表示的是布林值。
info屬性表示圖片的資訊,是一個字典。
五、圖片的模式和模式轉換
1. 圖片的模式
圖片有很多模式,支援以下標準模式,參考:https://pillow.readthedocs.io/en/latest/handbook/concepts.html#concept-modes
mode | 描述 |
1 | 1位畫素,黑白,每位元組儲存一個畫素 |
L | 8位元畫素,黑白 |
P | 8位元畫素,使用調色盤對映到任何其他模式 |
RGB | 3x8位元畫素,真彩色 |
RGBA | 4x8位元畫素,帶透明蒙版的真彩色 |
CMYK | 4x8位元畫素,分色 |
YCbCr | 3x8位元畫素,彩色視訊格式 |
LAB | 3x8位元畫素,L * a * b顏色空間 |
HSV | 3x8位元畫素,色相,飽和度,值顏色空間 |
I | 32位元有符號整數畫素 |
F | 32位元浮點畫素 |
1位畫素的範圍是0-1,0表示黑1表示白,中間表示灰。8位元畫素的範圍是0-255,如RGB的(0, 0, 0)表示黑,(255, 255, 255)表示白,依此類推。
2. 圖片的模式轉換
from PIL import Image image = Image.open("yazi.jpg") print(image.mode) image1 = image.convert('1') print(image1.mode) # image1.show() image_l = image.convert('L') print(image_l.mode) # image_l.show() image_p = image.convert('P') print(image_p.mode) image_p.show()
執行結果:
RGBA
1
L
convert(self, mode=None, matrix=None, dither=None, palette=WEB, colors=256): 將當前圖片轉換為指定的模式,並且返回轉換後的圖片。如果不指定模式,則選擇一種能保留圖片所有資訊且不使用調色盤的模式(通常的結果是不轉換)。將彩色影象轉換為灰度('L')時,使用ITU-R 601-2進行亮度轉換:L = R * 299/1000 + G * 587/1000 + B * 114/1000 。將灰度('L')或真彩('RGB')轉換為模式'1'時,如果dither引數為'NONE',所有大於128的值均設定為255(白色),所有其他值都設為0(黑色)。
convert()方法有5個引數,都有預設值,根據轉換的模式來傳值:
mode,圖片的模式,傳入需要轉換的模式。部分模式之間不支援轉換,程式碼會報錯。
matrix, 轉換矩陣。傳入該引數時,應該傳入由浮點數構成的元組,元組長度為4或12。matrix只支援從少數模式轉換成'L'或'RGB'。
dither, 高頻振動,用於控制顏色抖動。從模式'RGB'轉換為'P'或從'RGB'或'L'轉換為'1'時使用。可用的方法有'NONE'或'FLOYDSTEINBERG'(預設)。當提供了matrix引數時不使用此功能。
palette, 調色盤,用於控制調色盤的產生。從模式'RGB'轉換為'P'時使用,可用的方法有'WEB'(預設)或'ADAPTIVE'。'ADAPTIVE'表示使用自適應的調色盤。
colors, 自適應調色盤使用的顏色數。當palette引數為'ADAPTIVE'時,用於控制調色盤的顏色數目。預設是最大值,即256種顏色。
2.1 matrix引數的效果對比
from PIL import Image image = Image.open("yazi.jpg") image_rgb = image.convert('RGB') print(image_rgb.mode) image_l = image_rgb.convert('L') image_l.show() matrix = (0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6) image_l2 = image_rgb.convert('L', matrix=matrix) image_l2.show()
執行結果:
上面的程式碼中,給matrix引數傳入了一個長度為12的元組,matrix的值改變了轉換的效果,變化程度取決於傳入的元組中浮點數的值。注意,有些模式是不支援的,如'RGBA',且傳入的元組長度必須為4或12,否則報錯。
2.2 palette引數的效果對比
from PIL import Image image = Image.open("yazi.jpg") image_p = image.convert('P') # image_l.show() image_p2 = image.convert('P', palette='ADAPTIVE', colors=256) image_p2.show()
執行結果:
上面的程式碼中,將palette引數改為了'ADAPTIVE',圖片的差異不大,不過,如果將colors變小差異會比較大,但那樣會將圖片效果變差。
六、圖片拷貝貼上和儲存
from PIL import Image image = Image.open("yazi.jpg") image_copy = image.copy() # image_copy.show() image_new = Image.new('RGB', (160, 90), (0, 0, 255)) image_new2 = Image.new('L', (160, 90), '#646464') image_copy.paste(image_new, (100, 100, 260, 190), mask=image_new2) image_copy.save('duck.jpg') image_save = Image.open('duck.jpg') print(image_save.format, image_save.mode) image_copy.show()
執行結果:
jpg RGBA
copy(): 拷貝當前的圖片,拷貝出來的圖片與原圖一模一樣。如果想在圖片上貼上一些內容,又想保留原圖時,可以使用此方法。
paste(im, box=None, mask=None): 將另一張圖片貼上到當前圖片中,如果貼上的模式不匹配,則將被貼上圖片的模式轉換成當前圖片的模式。有3個引數。
im, 被貼上的圖片。傳入一張圖片,當第二個引數box指定的是一個區域時,im引數也可以是一個整數或顏色值(元組表示,16進位製表示和顏色名都可以,如上面程式碼中的image_new可以換成(0, 0, 255), '#0000FF', 'blue')。
box, 圖片貼上的位置或區域。傳入一個長度為2或4的元組,如果不傳值,預設為(0, 0),圖片被貼上在當前圖片的左上角。如果傳入長度為2的元組(x, y),表示被貼上圖片的左上角座標位置。如果傳入長度為4的元組(x1, y1, x2, y2),表示圖片貼上的區域,此時區域的大小必須與被貼上圖片一致,否則會報錯,傳入的元組長度為其他值也會報錯。
mask, 蒙版。傳入一張與被貼上圖片尺寸一樣的圖片,可以使用模式為'1'、'L'或者'RGBA'的影象。如果mask影象的顏色值為255,則直接按被貼上圖片的顏色貼上,如果mask影象的顏色值為0,則保留當前圖片的顏色(相當於沒有貼上),如果mask影象的顏色值為0~255之間的值,則將im與mask進行混合後再貼上。
save(fp, format=None, **params): 將當前圖片按指定的檔名儲存,執行後會將圖片按新名字儲存在當前路徑下(也可以指定路徑)。檔名最好帶擴充套件名,方便開啟,format表示圖片的格式,沒有指定format則會根據擴充套件名來解析(如果能解析出來),一般不需要指定format,傳入一個規範的檔名即可。
七、圖片的裁剪和縮放
from PIL import Image image = Image.open("yazi.jpg") image_crop = image.crop(box=(300, 300, 800, 700)) # image_crop.show() print('before resize: ', image.size) image_resize = image.resize((500, 400), resample=Image.LANCZOS, box=(100, 100, 1200, 800), reducing_gap=5.0) print('after resize: ', image_resize.size) image_resize.show()
執行結果:
before resize: (1557, 911)
crop(box=None): 裁剪圖片,返回裁剪區域的圖片。box表示裁剪的區域,傳入長度為4的元組(x1, y1, x2, y2),不傳預設為拷貝原圖,相當於copy()方法,如果裁剪的區域超過了原圖的區域,超出部分用畫素格填充。
resize(size, resample=BICUBIC, box=None, reducing_gap=None): 縮放圖片,返回縮放後的圖片。有4個引數。
size, 圖片縮放後的尺寸,傳入一個長度為2的元組(width, height)。
resample, 重取樣,是一個可選的重取樣過濾器。可以傳入Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, Image.BICUBIC, Image.LANCZOS。預設過濾器為Image.BICUBIC。如果影象的模式為'1'或'P',則始終設定為Image.NEAREST。
box, 縮放圖片的區域。傳入長度為4的元組(x1, y1, x2, y2),這個區域必須在原圖的(0, 0, width, height)範圍內,如果超出範圍會報錯,如果不傳值則預設將整張原圖進行縮放。
reducing_gap, 減少間隙。傳入一個浮點數,用於優化圖片縮放效果,預設不進行優化,值大於3.0時優化效果基本已經是公平的重取樣。
到此這篇關於Python Pillow(PIL)庫的用法介紹的文章就介紹到這了,更多相關Python Pillow(PIL)庫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章