Pillow 圖片處理模塊
Pillow是Python第三方庫,Python2中有一個叫PIL(Python Imaging Library)的標準庫,但不支持Python3,所以一些志愿者在PIL的基礎上創建了Pillow,支持Python3,Pillow支持動態影像編輯,
-
安裝Pillow
pip install pillowPillow安裝成功后,需要用PIL匯入:
import PILfrom PIL import ImageImage是最常用的模塊,
-
打開或者新建一張圖片
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') 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, # 進一步平滑 ] pic.filter(filters[6]).show() # 根據串列序號選擇效果并顯示
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/458619.html
標籤:Python
