PIL中所涉及的基本概念有如下幾個:通道(bands)、模式(mode)、尺寸(size)、座標系統(coordinate system)、調色板(palette)、信息(info)和濾波器(filters)。
1、 通道
每張圖片都是由一個或者多個數據通道構成。PIL允許在單張圖片中合成相同維數和深度的多個通道。
以RGB圖像爲例,每張圖片都是由三個數據通道構成,分別爲R、G和B通道。而對於灰度圖像,則只有一個通道。
如下圖:
2、 模式
圖像的模式定義了圖像的類型和像素的位寬。當前支持如下模式:
1:1位像素,表示黑和白,但是存儲的時候每個像素存儲爲8bit。
L:8位像素,表示黑和白。
P:8位像素,使用調色板映射到其他模式。
RGB:3x8位像素,爲真彩色。
RGBA:4x8位像素,有透明通道的真彩色。
CMYK:4x8位像素,顏色分離。
YCbCr:3x8位像素,彩色視頻格式。
I:32位整型像素。
F:32位浮點型像素。
PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。
3、 尺寸
通過size屬性可以獲取圖片的尺寸。這是一個二元組,包含水平和垂直方向上的像素數。
4、 座標系統
PIL使用笛卡爾像素座標系統,座標(0,0)位於左上角。注意:座標值表示像素的角;位於座標(0,0)處的像素的中心實際上位於(0.5,0.5)。
座標經常用於二元組(x,y)。長方形則表示爲四元組,前面是左上角座標。例如,一個覆蓋800x600的像素圖像的長方形表示爲(0,0,800,600)。
5、 調色板
調色板模式 ("P")使用一個顏色調色板爲每個像素定義具體的顏色值
6、 信息
使用info屬性可以爲一張圖片添加一些輔助信息。這個是字典對象。加載和保存圖像文件時,多少信息需要處理取決於文件格式。
7、 濾波器
對於將多個輸入像素映射爲一個輸出像素的幾何操作,PIL提供了4個不同的採樣濾波器:
NEAREST:最近濾波。從輸入圖像中選取最近的像素作爲輸出像素。它忽略了所有其他的像素。
BILINEAR:雙線性濾波。在輸入圖像的2x2矩陣上進行線性插值。注意:PIL的當前版本,做下采樣時該濾波器使用了固定輸入模板。
BICUBIC:雙立方濾波。在輸入圖像的4x4矩陣上進行立方插值。注意:PIL的當前版本,做下采樣時該濾波器使用了固定輸入模板。
ANTIALIAS:平滑濾波。這是PIL 1.1.3版本中新的濾波器。對所有可以影響輸出像素的輸入像素進行高質量的重採樣濾波,以計算輸出像素值。在當前的PIL版本中,這個濾波器只用於改變尺寸和縮略圖方法。
注意:在當前的PIL版本中,ANTIALIAS濾波器是下采樣(例如,將一個大的圖像轉換爲小圖)時唯一正確的濾波器。BILIEAR和BICUBIC濾波器使用固定的輸入模板,用於固定比例的幾何變換和上採樣是最好的。
二、程序案例演示
圖片的縮放:
from PIL import Image
img=Image.open('2.jpg')
img.show()
#縮放
w,h=img.size
img.thumbnail((w//2,h//2))
img.show()
執行程序結果:
圖片的旋轉:
from PIL import Image
img=Image.open('2.jpg')
img.show()
#旋轉
img=img.rotate(45)
img.show()
程序執行結果:
濾波器:
from PIL import Image,ImageFilter
img=Image.open('2.jpg')
img.show()
#濾波器
#EMBOSS浮雕
#img=img.filter(ImageFilter.EMBOSS)
#CONTOUR輪廓處理
# img=img.filter(ImageFilter.CONTOUR)
#BLUR模糊處理
#img=img.filter(ImageFilter.BLUR)
#DETAIL增強
img=img.filter(ImageFilter.DETAIL)
img.show()
程序依次的執行效果:
浮雕:
輪廓處理:
模糊處理:
增強:
查看通道數和圖像灰度化:
from PIL import Image,ImageFilter
img=Image.open('2.jpg')
img.show()
#查看圖像通道數
bands=img.getbands()
print(bands)
#圖像灰度化:RGB->L
img=img.convert('L')
img.show()
bands=img.getbands()
print(bands)
程序執行效果:取某一個像素點的顏色的值:
from PIL import Image,ImageFilter
img=Image.open('2.jpg')
#取某一個像素點的顏色的值
#三通道像素點的值
pixels=img.getpixel((87,180))
print(pixels)
#單通道像素點的值
img=img.convert('L')
pixels=img.getpixel((87,180))
print(pixels)
程序執行結果:
返回圖片的像素直方圖和當前使用的顏色:
from PIL import Image
#返回圖片的像素直方圖
img=Image.open('2.jpg')
pr=img.histogram()
print(pr)
#返回圖片當前正在被使用的顏色
colors=img.getcolors()
print(colors)
colors=img.getcolors()
print(colors)
運行結果:
圖像的粘貼:
from PIL import Image
#圖像的粘貼
img1=Image.open('1.jpg')
img2=Image.open('2.jpg')
#把img1粘貼到img2上
img2.paste(img1,(120,100))
#保存粘貼後的img2
img2.save('test.jpg','jpeg')
img2.show()
程序執行結果:
使用PIL生成驗證碼:
from PIL import Image,ImageDraw,ImageFont
import random
#生成隨機字母
def rndChar():
return chr(random.randint(65,90))
#隨機顏色1
def rndColor1():
return (random.randint(64,255)
,random.randint(64,255)
, random.randint(64, 255)
)
#隨機顏色2
def rndColor2():
return (random.randint(32,127)
,random.randint(32,127)
, random.randint(32, 127)
)
#生成一個畫布,240*60
width=240
height=60
image=Image.new('RGB',(width,height),(255,255,255))
#創建Font對象,生成字體
font=ImageFont.truetype('arial.ttf',36)
#創建Draw對象
draw=ImageDraw.Draw(image)
#填充像素,背景干擾項
for x in range(width):
for y in range(height):
draw.point((x,y),fill=rndColor1())
#背景上輸出文字
for i in range(4):
draw.text((60*i+10,10),rndChar(),font=font,fill=rndColor2())
image.show()
執行程序結果: