Pillow 圖片處理模塊 Pillow是Python第三方庫,Python2中有一個叫PIL(Python Imaging Library)的標準庫,但不支持Python3,所以一些志願者在PIL的基礎上創建了Pillow,支持Python3。Pillow支持動態圖像編輯。 安裝Pillow pi ...
Pillow 圖片處理模塊
Pillow是Python第三方庫,Python2中有一個叫PIL(Python Imaging Library)的標準庫,但不支持Python3,所以一些志願者在PIL的基礎上創建了Pillow,支持Python3。Pillow支持動態圖像編輯。
-
安裝Pillow
pip install pillow
Pillow安裝成功後,需要用PIL導入:
import PIL
from PIL import Image
Image是最常用的模塊。
-
打開或者新建一張圖片
import PIL from PIL import Image pic = Image.open('11.jpg') pic.show() im = Image.new('RGB', (480, 640), ('pink')) im.show()
Image.new()方法有三個參數:圖像模式(RGB),圖像尺寸(寬,高),顏色(red,green,blue),顏色可以直接用#0000FF或者blue表示藍色。
Image.show()方法可以調用系統自帶的圖像查看程式顯示當前圖片,如系統中並未安裝相應程式,有執行程式時將無任何顯示。
-
Image模塊的常用屬性
print('寬:', pic.width) # 寬: 1361 print('高:', pic.height) # 高: 1814 print('尺寸:', pic.size) # 尺寸: (1361, 1814) print('色彩模式:', pic.mode) # 色彩模式: RGB print('圖像格式:', pic.format) # 圖像格式: JPEG # print('圖片類別:', pic.category) print('只讀:', pic.readonly) # 只讀: 1 print('圖片信息:', pic.info) # 圖片信息: {'jfif': 257, 'jfif_version': (1, 1), 'jfif_unit': 0, 'jfif_density': (1, 1)}
其中size屬性返回的是一個元組。
-
Image.convert()方法進行圖像模式(mode)轉換,支持以下標準模式:
convert(self, mode=None, matrix=None, dither=None, palette=WEB, colors=256): 將當前圖片轉換為指定的模式,並且返迴轉換後的圖片。
如果不指定模式,則選擇一種能保留圖片所有信息且不使用調色板的模式(通常的結果是不轉換)。
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)表示白,依此類推。
pic1 = pic.convert('1') pic1.show()
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種顏色。
-
圖片的複製、粘貼和保存
pic = Image.open('11.jpg') im = Image.new('RGB', (128, 128), (255, 0, 0)) im1 = Image.new('RGBA', (128, 128), (0, 0, 255)) pic1 = pic.copy() pic1.paste(im, (640, 600), mask=im1) pic1.save('22.jpg', quality=95, subsampling=0)
Image.copy()方法:將指定對象複製並返回。
Image.paste(im,(行,列),mask=None):在當前圖片對象基礎上,把im對象粘貼到指定位置,mask參數指定蒙板。
Image.save()方法:保存當前圖片對象到指定位置。
具體說明:
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, quality=95, subsampling=0): 將當前圖片按指定的文件名保存,運行後會將圖片按新名字保存在當前路徑下(也可以指定路徑)。文件名最好帶擴展名,方便打開,format表示圖片的格式,沒有指定format則會根據擴展名來解析(如果能解析出來),一般不需要指定format,傳入一個規範的文件名即可。quality:壓縮比,預設是75。subsampling:可選參數為0,1,2;選擇0即可實現小變大的需求。
-
圖片裁剪和縮放
pic = Image.open('11.jpg') im_crop = pic.crop(box=(200, 200, 680, 840)) im_crop.show() im_resize = pic.resize((480, 640),reducing_gap=2) im_resize.show()
im_crop = pic.crop(box=(200, 200, 680, 840)):裁剪圖片,box參數中的四個數字為圖片坐標,分別是x1,y1,x2,y2。
im_resize = pic.resize((480, 640),reducing_gap=2):
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時優化效果基本已經是公平的重採樣。
-
圖片旋轉和翻轉
- rotate()方法:將圖片對象進行旋轉,可以實現順時針或逆時針任意角度。
- transpose()方法:將圖片對象進行順時針或逆時針90度旋轉或者翻轉,區別於上面的方法不能任意角度,但可以進行垂直或水平翻轉。 ★★★★★這個方法比較常用,但根據系統提示在Pillow10(2023-07-01)更新後會停用現在的方法。
im_resize.rotate(45).show() # 圖片向左(逆時針)旋轉45度並顯示。 im_resize.transpose(Image.FLIP_LEFT_RIGHT).show() # 逆時針旋轉90度並顯示。 im_resize.transpose(Image.FLIP_TOP_BOTTOM).show() # 逆時針旋轉90度並顯示。 im_resize.transpose(Image.ROTATE_90).show() # 逆時針旋轉90度並顯示。 im_resize.transpose(Image.ROTATE_180).show() # 逆時針旋轉90度並顯示。 im_resize.transpose(Image.ROTATE_270).show() # 逆時針旋轉90度並顯示。
-
圖片特效
Pillow提供一些簡單的圖片特效使用,需要從PIL庫中導入ImageFilter模塊。
pic = Image.open('11.jpg') def pic_filter(imfile, x): filters = [ ImageFilter.BLUR, # 模糊效果 ImageFilter.DETAIL, # 細節效果 ImageFilter.CONTOUR, # 輪廓效果 ImageFilter.EDGE_ENHANCE, # 邊緣增強(比銳化更好) ImageFilter.EDGE_ENHANCE_MORE, # 進一步邊緣增強 ImageFilter.FIND_EDGES, # 查找邊緣 ImageFilter.EMBOSS, # 浮雕效果 ImageFilter.SHARPEN, # 銳化 ImageFilter.SMOOTH, # 平滑 ImageFilter.SMOOTH_MORE, # 進一步平滑 ] return imfile.filter(filters[x]) # 根據列表序號選擇效果並顯示 pic_filter(pic,3).show()