Pillow中最重要的類就是Image,該類存在於同名的模塊中。可以通過以下幾種方式實例化:從文件中讀取圖片,處理其他圖片得到,或者直接創建一個圖片。
還有一個類為ImageDraw,用來畫圖。
1、Image.alpha_composite(im1,im2)
將im2復合到im1上,返回一個Image對象
參數:im1--第一個圖像
im2--第二個圖像 im1和im2的size要相同。且im1和im2的mode都必須是RGBA
#!coding=utf-8 from PIL import Image img1=Image.new("RGBA",(100,100),"red") img2=Image.new("RGBA",(100,100),"yellow") img3=Image.alpha_composite(img1,img2) img3.show
結果為:
2、Image.blend(im1,im2,alpha)
返回回一個融合后的Image對象,得到的Image由im1和im2決定。:公式:out=im1*(1-alpha)+im2*alpha
參數:im1--第一個圖像
im2--第二個圖像 im1和im2的size要相同。
alpha-- 如果 alpha = 0.0, 第一個圖像返回. 如果alpha =1.0, 第2個圖像返回.alpha沒有嚴格的值,如果有必要,就設置成剛好合適的范圍內。
例子:
#!coding=utf-8 from PIL import Image path="E:\\study\\test.png" img1=Image.open(path) img2=Image.new("RGB",img1.size,"red") img3=Image.blend(img1,img2,0.5) #img1和img2的size要相同,不然會引起一個ValueError img3.show()
img1在合並img2前的圖片為:
img1和img2合並后,得到的img3為:
3、PIL.Image.composite(im1,im2,mask)
通過使用透明遮罩混合圖像創建復合圖像。
參數:im1--第一個圖像
im2--第二個圖像 im1和im2的size和mode必須相同。
mask--也是一個圖像,mode 可以為“1”, “L”, or “RGBA”,並且大小要和im1、im2一樣
#!coding=utf-8 from PIL import Image from PIL import ImageDraw path1="E:\\study\\test.png" img1=Image.open(path1) img2=Image.new("RGB",img1.size,"blue") img3=Image.new("RGBA",img1.size,"black") img4=Image.composite(img1,img2,img3) img4.show()
得到的結果:
其他例子:
例子1:畫一個藍底的圖片,圖片中有一個紅色的圓
#! coding=utf-8 from PIL import Image from PIL import ImageDraw path="E:\\study\\yy.png" #文件存儲的路徑 image=Image.new("RGB",(200,200),"blue")#創建一個藍色的,大小為200*200像素的RGB圖片 drawObject=ImageDraw.Draw(image) drawObject.ellipse((50,50,80,80),fill="red")#在image上畫一個紅色的圓 image.save(path)#保存圖片 """以下代碼用來顯示出畫的圖片""" try: img=Image.open(path) img.show()#標准版本的show()方法不是很有效率,因為它先將圖像保存為一個臨時文件,然后使用xv進行顯示。如果沒有安裝xv,該函數甚至不能工作。但是該方法非常便於debug和test。(windows中應該調用默認圖片查看器打開) except IOError,e: print e.message
結果圖片展示結果:
例子2:將QQ 頭像(或者微博頭像)右上角加上一個圓形紅色底的白色數字,類似於微信未讀信息數量那種提示效果。
#! coding=utf-8 from PIL import Image from PIL import ImageDraw from PIL import ImageFont path="E:\\study\\test.png" #文件存儲的路徑 path2="E:\\study\\test2.png" Font3 = ImageFont.truetype("C:\Windows\Fonts\simsunb.ttf",20) text="3" img=Image.open(path) box1=(55,0,75,20) drawObject=ImageDraw.Draw(img) drawObject.ellipse(box1,fill="red") drawObject.text([60,2],text,fill="white",font=Font3)#寫入文字3 img.save(path2) """以下代碼用來顯示出畫的圖片""" try: image=Image.open(path2) image.show()#標准版本的show()方法不是很有效率,因為它先將圖像保存為一個臨時文件,然后使用xv進行顯示。如果沒有安裝xv,該函數甚至不能工作。但是該方法非常便於debug和test。(windows中應該調用默認圖片查看器打開) except IOError,e: print e.message
結果圖片顯示結果:
相關函數如下:
一、Image Module(from PIL import Image)
Image.open(fp)--fp可以是文件名,也可是file object,但是必須是以'r'模式打開的。最后返回一個Image 對象
Image.blend(im1,im2,alpha) --返回一個融合后的Image對象,out=im1*(1-alpha)+im2*alpha
Image.composite(im1,im2,mask)--返回一個融合后的Image對象,out由透明遮罩mask和原始im1,im2決定,mask模式為'1','L'或'RGBA'
L模式下:out=im1*L/255+im2*(1-L/255)
RGBA模式下:out=im1*mask+im2*(1-mask),mask的值由mask圖像在該點是否為空及alpha值決定
--使用RGBA模式的mask(ImageDraw畫出矩形或圓形等局部圖形)可以實現局部透明度的變化
blend方法要想實現局部透明度變化只能crop,paste
Image.eval(im,func) --func為接受一個整數參數的函數,將im的每個像素值分別傳給func處理並返回最后的Image對象
Image.new(mode,size,color=0) --創建一個新對象,mode為單通道時,color為一個整數或浮點數;
多通道時,color為元組,元素數目對應通道數。
Image.fromarray(obj,mode=None) --從含有array interface 的其他對象創建Image對象
Image.merge(mode,bands) --融合多個通道圖像
Image 對象的屬性(im=Image.open(fp))
im.mode--如'L','RGB'等
im.size--(200,300)
im.format --如'JPEG'
im.info 、im.palette
Image 對象的方法(im=Image.open(fp))
im.convert(mode)--轉換模式,如'L','RGB'
im.copy() --復制,不影響原圖像
im.crop(box) --復制一部分圖像,box為一個元組,定義矩形的左上角和右下角。改變原圖像,可能會也可能不會影響crop的部分,
如果想使復制的部分脫離原圖像的影響,對crop后的部分采用load方法
im.getbands() --返回一個包含各通道名稱的元組
im.getbbox() --返回非空邊界矩形,左上點和右下點
im.getdata() --返回一個扁平化的圖像像素序列(PIL內在類型),之后需要使用list()方法將其轉化為python語言的序列
im.getextrema() --返回每個通道中像素值得(min,max)值
im.getpixel((x,y)) --返回(x,y)處的像素值
im.histogram() --返回直方圖統計數據
im.paste(im1,box=None)--將im1粘貼到im上,box默認為None,表示從(0,0)開始粘貼,也可以設置為其他二元元組或四元元組
設置為四元元組時,im1的大小必須和box表示的矩形大小一樣。另外,'RGBA'模式的alpha將被忽視
im.resize(size,resample=0) --調整大小,resample有四個選項,默認為第一個,第四個質量更高一些
Image.NEAREST:nearest neighbour
Image.BILINEAR:linear interpolation
Image.BICUBIC:cubic spline interpolation
Image.LANCZOS:a high-quality downsa
mpling filter
im.rotate(degrees,resample=0,expand=0) --逆時針旋轉某一度數,resample有三個選項,默認第一個;expand默認為0,
保持旋轉后圖像和原來大小相同,超出邊界的部分舍掉,設置為True則擴展圖像大小以保證能全部顯示原圖像的內容
im.save(fp,format=None) --保存圖像
im.show(title=None) --調試時常用來顯示圖像
im.split() --分離通道,返回分離后的通道元組
im.transpose(method)--旋轉圖像,method有:Image.FLIP_LEFT_RIGHT 左右顛倒
Image.FLIP_TOP_BOTTOM 上下顛倒
Image.ROTATE_90 逆時針旋轉90度
Image.ROTATE_180 逆時針旋轉180度
Image.ROTATE_270 逆時針旋轉 270度
Image.TRANSPOSE 上下左右顛倒
im.load() --分配圖像存儲空間,載入像素數據,一般open得到的對象會自動調用,無需手動調用
因為此方法會使圖像對象和原文件斷絕聯系,故在im.crop()后可用於切斷復制部分與原圖像的聯系
二、ImgaeFont Module (from PIL import ImageFont)
ImageFont.load(filename) --加載字體文件,返回一個font對象
ImageFont.load_path(filename) --加載字體文件,會沿着Python Path尋找
ImageFont.truetype(font=None,size=10,index=0) --加載TrueType或opentype類型的字體文件,返回一個size大小的font對象
當前目錄沒有該文件則去windows的fonts目錄下查找
index決定加載哪個font face(一個字體文件可能會包含多個相關的字體)
ImageFont對象方法(font=ImageFont.load(f)):
font.getsize(text)--返回text在當前字體下的大小
3.ImageColor Module (from PIL import ImageColor)
ImageColor.getrgb(color) --將字符串形式的color轉換為rgb的形式,即(r,g,b[,a])
ImageColor.getcolor(color,mode) --將字符串形式的color轉換為rgb或greyscale的形式
mode是color(如’RGB'),則返回(r,g,b[,a]);不是color(如'L')則返回(graylevel[,a])
該模塊支持的color字符串的形式有以下幾種:
(1)十六進制形式,#rgb或者#rrggbb,如#00ff00,#0b1
(2)RGB Function,如rgb(255,0,0)或者rgb(100%,0%,20%)
(3)HSL模式,如hsl(0,20%,100%),hsl(360,0%,100%)
(4)HTML顏色,如'red','Red'
三、ImageDraw Module (from PIL import ImageDraw)
ImageDraw.Draw(im) --返回一個繪圖對象,使以后的繪圖操作發生在im上
Draw對象方法(draw=ImageDraw.Draw(im)):
注:無特殊說明,參數box類型默認為[x,y,x,y]或[(x,y),(x,y)];xy參數類型默認為[x,y,x,y,x,y...]或者[(x,y),(x,y),(x,y),...]
draw.arc(box,start,end,fill=None) --start定義起始角度(0代表3點鍾方向),end定義終止角度,都為degrees,正方向為順時針。
draw.chord(box,start,end,fill=None,outline=None) --類似arc,但是連接首尾端
點,fill為填充顏色,outline為描邊顏色
draw.ellipse(box,fill=None,outline=None) --畫一個橢圓
draw.line(xy,fill=None,width=0) --直線
draw.pieslice(box,start,end,fill=None,outline=None) --畫一個扇形
draw.points(xy,fill=None) --點
draw.polygon(xy,fill=None,outline=None) --畫一個多邊形
draw.rectangle(box,fill=None,outline=None) --矩形
draw.text(xy,text,fill=None,font=None) --xy為左上點位置,font為ImageFont對象
draw.textsize(text,font=None) --返回text在font字體下的大小