一具伍、 安裝
參考文檔:https://pillow.readthedocs.io/en/latest/installation.html
Pillow
的安裝比較的簡單演闭,直接pip安裝即可:
pip install Pillow
但是要注意的一點是焚刚,Pillow
和PIL
不能共存在同一個環(huán)境中,所以如果安裝的有PIL
的話旦袋,那么安裝Pillow
之前應(yīng)該刪除PIL
。
由于是繼承自PIL
的分支,所以Pillow
的導(dǎo)入是這樣的:
import PIL
# 或者
from PIL import Image
注意:圖像處理庫PIL
(Python Imaging Library )支持python2,不支持python3初茶。
二、使用手冊
1浊闪、Image類的使用
Image
是Pillow中最為重要的類恼布,實現(xiàn)了Pillow中大部分的功能。要創(chuàng)建這個類的實例主要有三個方式:
- 從文件加載圖像
- 處理其他圖像獲得
- 創(chuàng)建一個新的圖像
(1) 讀取圖像
一般來說搁宾,我們都是都過從文件加載圖像來實例化這個類折汞,如下所示:
from PIL import Image
picture = Image.open('happy.png')
如果沒有指定圖片格式的話,那么Pillow
會自動識別文件內(nèi)容為文件格式盖腿。
(2)新建圖像
Pillow
新建空白圖像使用new()
方法爽待, 第一個參數(shù)是mode即顏色空間模式损同,第二個參數(shù)指定了圖像的分辨率(寬x高),第三個參數(shù)是顏色鸟款。
- 可以直接填入常用顏色的名稱膏燃。如'red'。
- 也可以填入十六進制表示的顏色何什,如
#FF0000
表示紅色组哩。 - 還能傳入元組,比如(255, 0, 0, 255)或者(255富俄, 0禁炒, 0)表示紅色。
picture = Image.new('RGB', (200, 100), 'red')
(3)保存圖像
保存圖片的話需要使用save()
方法:
picture.save('happy.png')
保存的時候霍比,如果沒有指定圖片格式的話幕袱,那么Pillow
會根據(jù)輸入的后綴名決定保存的文件格式。
2悠瞬、圖像的坐標(biāo)表示
在Pillow中们豌,用的是圖像的左上角為坐標(biāo)的原點(0,0)浅妆,所以這意味著望迎,x軸的數(shù)值是從左到右增長的,y軸的數(shù)值是從上到下增長的凌外。
我們處理圖像時辩尊,常常需要去表示一個矩形的圖像區(qū)域。Pillow
中很多方法都需要傳入一個表示矩形區(qū)域的元組參數(shù)康辑。
這個元組參數(shù)包含四個值摄欲,分別代表矩形四條邊的距離X軸或者Y軸的距離。順序是(左疮薇,頂胸墙,右,底)
按咒。其實就相當(dāng)于迟隅,矩形的左上頂點坐標(biāo)為(左,頂)
励七,矩形的右下頂點坐標(biāo)為(右智袭,底)
,兩個頂點就可以確定一個矩形的位置掠抬。
右和底坐標(biāo)稍微特殊补履,跟python列表索引規(guī)則一樣,是左閉右開的剿另◇锎福可以理解為[左, 右)
和[頂贬蛙, 底)
這樣左閉右開的區(qū)間。比如(3, 2, 8, 9)就表示了橫坐標(biāo)范圍[3, 7]谚攒;縱坐標(biāo)范圍[2, 8]的矩形區(qū)域阳准。
(1) 常用屬性
-
PIL.Image.filename
圖像源文件的文件名或者路徑,只有使用
open()
方法創(chuàng)建的對象有這個屬性馏臭。類型:字符串
-
PIL.Image.format
圖像源文件的文件格式野蝇。
-
PIL.Image.mode
圖像的模式,一般來說是“1”, “L”, “RGB”, 或者“CMYK” 括儒。
-
PIL.Image.size
圖像的大小
-
PIL.Image.width
圖像的寬度
-
PIL.Image.height
圖像的高度
-
PIL.Image.info
圖像的一些信息绕沈,為字典格式
(2)常用方法
-
裁剪圖片
Image
使用crop()
方法來裁剪圖像,此方法需要傳入一個矩形元祖參數(shù)帮寻,返回一個新的Image
對象乍狐,對原圖沒有影響。
croped_im = im.crop((100, 100, 200, 200))
注意:圖片在計算機中是一個矩陣形式存在
-
復(fù)制與粘貼圖像
復(fù)制圖像使用copy()
方法:
copyed_im = im.copy()
粘貼圖像使用paste()
方法:
croped_im = im.crop((100, 100, 200, 200))
im.paste(croped_im, (0, 0))
im對象調(diào)用了paste()
方法固逗,第一個參數(shù)是被裁剪下來用來粘貼的圖像浅蚪,第二個參數(shù)是一個位置參數(shù)元祖,這個位置參數(shù)是粘貼的圖像的左頂點烫罩。
-
調(diào)整圖像的大小
調(diào)整圖像大小使用resize()
方法:
resized_im = im.resize((width, height))
resize()
方法會返回一個重設(shè)了大小的Image
對象惜傲。
或者使用thumbnail()方法
im = Image.open('test.jpg')
#獲得圖像尺寸
w, h = im.size
# 縮放到50%
im.htumbnail((w//2, h//2))
#顯示圖片
im.show()
thumbnail()
方法可以用來制作縮略圖。它接受一個二元數(shù)組作為縮略圖的尺寸贝攒,然后將示例縮小到指定尺寸
-
旋轉(zhuǎn)圖像和翻轉(zhuǎn)圖像
旋轉(zhuǎn)圖像使用rotate()
方法盗誊,此方法按逆時針旋轉(zhuǎn),并返回一個新的Image
對象:
# 逆時針旋轉(zhuǎn)90度
im.rotate(90)
im.rotate(180)
im.rotate(20, expand=True)
旋轉(zhuǎn)的時候隘弊,會將圖片超出邊界的邊角裁剪掉哈踱。如果加入expand=True
參數(shù),就可以將圖片邊角保存住长捧。
翻轉(zhuǎn)圖像使用transpose()
:
# 水平翻轉(zhuǎn)
im.transpose(Image.FLIP_LEFT_RIGHT)
# 垂直翻轉(zhuǎn)
im.transpose(Image.FLIP_TOP_BOTTOM)
-
獲得圖片通道名稱
im.getbands()
-
通過通道分割圖片
(1) split()
split()
可以將多通道圖片按通道分割為單通道圖片。返回各個通道的灰度圖組成的元組
R, G, B = im.split()
split()
方法返回的是一個元祖吻贿,元祖中的元素則是分割后的單個通道的圖片串结。
(2)getchannel(channel)
getchannel()
可以獲取單個通道的圖片:
R = im.getchannel("R")
-
模式轉(zhuǎn)化
img = im.convert("L") #轉(zhuǎn)為灰度
-
獲取單個像素的值
使用getpixel
(xy)方法可以獲取單個像素位置的值:
im.getpixel((100, 100))
傳入的xy需要是一個元祖形式的坐標(biāo)。
如果圖片是多通道的舅列,那么返回的是一個元祖肌割。
-
加載圖片全部數(shù)據(jù)
我們可以使用load()
方法加載圖片所有的數(shù)據(jù),并比較方便的修改像素的值:
pixdata = im.load()
pixdata[100,200] = 255
此方法返回的是一個PIL.PyAccess
帐要,可以通過這個類的索引來對指定坐標(biāo)的像素點進行修改把敞。
-
獲取全部像素內(nèi)容
getdata(band = None)
方法,用來獲取 Image
類的對象中的像素內(nèi)容
該方法會將圖片中的像素內(nèi)容榨惠,逐行逐行地拼接起來奋早,作為一個完整的序列返回盛霎。方法的返回類型,是 PIL 庫的內(nèi)部類型耽装。我們可以用 list(im.getdata())
得到標(biāo)準(zhǔn)的 Python list
對象愤炸。
band
意味「通道」。當(dāng) band = None
時掉奄,方法返回所有通道的像素內(nèi)容规个;當(dāng) band = 0
時,則返回第一個通道的像素內(nèi)容姓建。例如诞仓,對于 RGB 模式的位圖,band = 0
返回 R 通道的內(nèi)容速兔;band = 2
返回 B
通道的內(nèi)容墅拭。
from PIL import Image
im = Image.open('test.jpg')
print(im.getdata()) #獲取所有通道的值 類似生成器的對象
print(list(im.getdata(0))) #獲取第一個通道的值, 轉(zhuǎn)化為列表
-
關(guān)閉圖片并釋放內(nèi)存
此方法會刪除圖片對象并釋放內(nèi)存
im.close()