(python)圖片處理Pillow模塊的使用


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 Modulefrom 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.NEARESTnearest neighbour

Image.BILINEARlinear interpolation

Image.BICUBICcubic spline interpolation

Image.LANCZOSa 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) --加載TrueTypeopentype類型的字體文件,返回一個size大小的font對象

當前目錄沒有該文件則去windowsfonts目錄下查找

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轉換為rgbgreyscale的形式

modecolor(’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為左上點位置,fontImageFont對象

draw.textsize(text,font=None) --返回textfont字體下的大小

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM