pillow教程

導入
from PIL import Image
打開圖片
#方式一:
im = Image.open('1.jpg')
#方式二
f = open('1.jpg','rb')
im = Image.open(f)
#從tar壓縮文件打開
from PIL import TarIO
fp = TarIO.TarIO('2.tar','1.jpg')  #壓縮文件名   圖片名
im = Image.open(fp)
查看格式
im.format
查看大小
im.size
查看模式
im.mode
查看文件名
im.filename
查看位數
im.bits
顯示圖片
im.show()
保存圖片
im.save('1.bmp')
查看高度
im.height
查看寬度
im.width
縮略圖
size = (500,500)    #縮略圖大小
im.thumbnail(size)  #原圖的類似圖,寬高中較大值爲500
複製圖片
tn = im.copy()
截取圖片
box = (100,100,400,400)  #定義截取的左上右下邊界
region = im.crop(box)  #一種懶方法,可用load提早執行
旋轉圖片
region = region.transpose(Image.ROTATE_180)#順時針旋轉180°
out = im.rotate(45) #將圖片逆時針旋轉45°
粘貼圖片
im = im.paste(region, box)
分離RGB
r,g,b = im.split()   #分離RGB通道
合成RGB
im = Image.merge("RGB",(g,r,b))  #用RGB通道合成新圖
更改大小
size = (500,500)    #圖片大小設定
out = im.resize(size)
置換圖片
out = im.transpose(Image.FLIP_LEFT_RIGHT)  #0
out = im.transpose(Image.FLIP_TOP_BOTTOM)  #1
out = im.transpose(Image.ROTATE_90)        #2
out = im.transpose(Image.ROTATE_180)       #3
out = im.transpose(Image.ROTATE_270)       #4
out = im.transpose(Image.TRANSPOSE)        #5
模式轉換
out = im.convert('L')        #將圖片轉換成黑白圖
使用濾鏡
from PIL import ImageFilter     #導入濾鏡模塊
out = im.filter(ImageFilter.DETAIL)
point操做
out = im.point(lambda i:i*1.5)
圖片加強
from PIL import ImageEnhance    #導入圖片加強模塊
enh = ImageEnhance.Contrast(im)    
enh.enhance(1.3).show("30% more contrast")  #對比度增長30%
動態圖片
im = Image.open('2.gif')     #打開一張動態圖片,默認第0幀
im.n_frames                #查看動態圖幀數
im.tell()                  #當前幀數
im.seek(i)                  #查找第i幀
im.show()                  #顯示第i幀內容
 使用ImageSequence
from PIL import ImageSequence     #導入ImageSequence
for frame in ImageSequence.Iterator(im):    #使用迭代器
    im.show()               #顯示各幀圖片
 獲取Bands
im.getbands()
 
將圖片左右置換
from PIL import Image
import os, sys

def roll(image, delta):
 "Roll an image sideways"
 xsize, ysize = image.size
 delta = delta % xsize
 if delta == 0:
 return image
 part1 = image.crop((0, 0, delta, ysize))
 part2 = image.crop((delta, 0, xsize, ysize))
 part1.load()
 part2.load()
 image.paste(part2, (0, 0, xsize-delta, ysize))
 image.paste(part1, (xsize-delta, 0, xsize, ysize))
 return image


if __name__ == '__main__':
 im = Image.open(sys.argv[1])
 im.show()
 delta = int(sys.argv[2])
 re = roll(im, delta)
 re.show()
常見模式
• 1 (1-bit pixels, black and white, stored with one pixel per byte)
• L (8-bit pixels, black and white)
• P (8-bit pixels, mapped to any other mode using a color palette)
• RGB (3x8-bit pixels, true color)
• RGBA (4x8-bit pixels, true color with transparency mask)
• CMYK (4x8-bit pixels, color separation)
• YCbCr (3x8-bit pixels, color video format)
– Note that this refers to the JPEG, and not the ITU-R BT.2020, standard
• LAB (3x8-bit pixels, the L*a*b color space)
• HSV (3x8-bit pixels, Hue, Saturation, Value color space)
• I (32-bit signed integer pixels)
• F (32-bit floating point pixels)







Image類

Pillow中最重要的類就是Image,該類存在於同名的模塊中。能夠經過如下幾種方式實例化:從文件中讀取圖片,處理其餘圖片獲得,或者直接建立一個圖片。python

使用Image模塊中的open函數打開一張圖片:sql

from PIL import Image im = Image.open('1.gif') print(im) print(im.format,im.size,im.mode)

 

若是打開成功,返回一個Image對象,能夠經過對象屬性檢查文件內容markdown

<PIL.GifImagePlugin.GifImageFile image mode=P size=170x288 at 0x567748> GIF (170, 288) P
  • format屬性定義了圖像的格式,若是圖像不是從文件打開的,那麼該屬性值爲None;
  • size屬性是一個tuple,表示圖像的寬和高(單位爲像素);
  • mode屬性爲表示圖像的模式. 
    模式屬性以下:
1 1位像素,黑和白,存成8位的像素
L 8位像素,黑白
P 8位像素,使用調色板映射到任何其餘模式
RGB 3×8位像素,真彩
RGBA 4×8位像素,真彩+透明通道
CMYK 4×8位像素,顏色隔離
YCbCr 3×8位像素,彩色視頻格式
I 32位整型像素
F 32位浮點型像素

當有一個Image對象時,能夠用Image類的各個方法進行處理和操做圖像,例如顯示圖片。app

im.show()

PS:標準版本的show()方法不是頗有效率,由於它先將圖像保存爲一個臨時文件,而後使用查看器進行顯示。ide

讀寫圖片

Pillow庫支持至關多的圖片格式。直接使用Image模塊中的open()函數讀取圖片,而沒必要先處理圖片的格式,Pillow庫自動根據文件決定格式。函數

Image模塊中的save()函數能夠保存圖片,除非你指定文件格式,那麼文件名中的擴展名用來指定文件格式。post

im = Image.open('1.gif') im.save('f.BMP')

一般,save用以保存一個臨時的image對象到硬盤。而轉換工做由一個功能更爲強大的convert()方法來完成。性能

拷貝,粘貼,合併圖片

from PIL import Image im = Image.open('tu.jpg') #設置要拷貝的區域 box = (100, 100, 500, 500) # 將im表示的圖片對象拷貝到region中,大小爲(400*400)像素。 # 這個region能夠用來後續的操做(region其實就是一個Image對象), # box變量是一個四元組(左,上,右,下)。 region = im.crop(box) # 從字面上就能夠看出,先把region中的Image反轉180度,而後再放回到region中。 region = region.transpose(Image.ROTATE_90) #粘貼box大小的region到原先的圖片對象中。 im.paste(region, box) im.save('1.jpg')

 

這裏寫圖片描述

區域由4-tuple決定,該tuple中信息爲(left, upper, right, lower),Pillow左邊系統的原點(0,0)爲圖片的左上角。座標中的數字單位爲像素點。 
上面示例粘貼後的圖片是臨時性,須要save保存成新圖片。字體

box = im.copy() #直接複製圖像

分離和合並通道

每個RGB都是由三個通道的灰度圖疊加的,因此pil提供了將這三個通道分離的方法. 
對於單通道圖片,split()返回圖像自己。爲了處理單通道圖片,必須先將圖片轉成RGB。ui

r,g,b = im.split()#分割成三個通道 im = Image.merge("RGB", (b, g, r)) #將b,r兩個通道進行翻轉。 im.save('rgb.jpg')

這裏寫圖片描述

幾何轉變

Image類有resize()、rotate()和transpose()、transform()方法進行幾何變換,用以重定義圖片大小,對圖片進行旋轉等操做。 
簡單幾何變換:

out = im.resize( ( 128,128)) out = im.rotate(45)

這裏寫圖片描述 
置換圖像:

# 左右翻轉 out = im.transpose(Image.FLIP_LEFT_RIGHT) # 上下反向 out = im.transpose(Image.FLIP_TOP_BOTTOM) out = im.transpose(Image.ROTATE_90)

 

transpose()和象的rotate()沒有性能差異。 
這裏寫圖片描述

模式轉換

# 黑白 am = im.convert('L') am.show()

圖像加強

1.濾鏡 
ImageFilter模塊提供了不少預約義的圖片增強濾鏡。 
好比一個經常使用的濾鏡,細節(detail濾鏡)

from PIL import ImageFilter im = Image.open('tu.jpg') out = im.filter(ImageFilter.DETAIL) 

2.直接操做像素點 
能夠對每一個像素點進行操做,並且,每個通道均可以獨立的進行操做。好比,將每一個像素點的亮度(不知道有沒有更專業的詞)增大20%

#注意這裏用到一個匿名函數(那個能夠把i的1.2倍返回的函數) out = im.point(lambda i : i * 1.2)

3.讀寫圖片的更多方式 
一般,咱們使用open方法進行圖片的打開操做。可是這不是惟一的方式。徹底能夠跟python的IO整合起來。

fp = open("tu.jpg", "rb") im = Image.open(fp) 

附件:原圖 
這裏寫圖片描述

 
 

圖片加上文字

from PIL import Image,ImageDraw,ImageFont im = Image.open('tu.jpg') draw = ImageDraw.Draw(im) (width, height) = im.size myfont = ImageFont.truetype('yuanqi.ttf',size = 120) fillcolor = 'pink' #第一個參數是加入字體的座標 #第二個參數是文字內容 #第三個參數是字體格式 #第四個參數是字體顏色 draw.text( (60,100) , u'萌萌噠' ,font = myfont , fill = fillcolor ) im.save('tu_word.jpg')

這裏寫圖片描述

圖片加上數字

from PIL import Image,ImageDraw,ImageFont im = Image.open('tu.jpg') draw = ImageDraw.Draw(im) (width, height) = im.size myfont = ImageFont.truetype('yuanqi.ttf',size = 120) #在圖上畫一個圓,ellipse參數分別爲 左上角的座標,右下角的座標 #ellipse(左上X , 左上Y , 右下X , 右下Y) draw.ellipse((width-200, 0 ,width,200),fill="red",outline="red") draw.text((width-120,20 ),'5',font=myfont,fill='white') im.save('tu_number.jpg')

 

這裏寫圖片描述

將圖片轉化成字符畫

#coding:utf-8 from PIL import Image #要索引的字符列表 ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") length = len(ascii_char) #讀取圖像文件 def readImg(): img = Image.open('kai.png') (width,height) = img.size img = img.resize( ( int(width * 0.9) , int(height * 0.5) )) print(img.size) return img def convert(img): # 轉爲灰度圖像 img = img.convert('L') txt = '' for y in range(img.size[1]): for x in range(img.size[0]): # 獲取每一個座標像素點的灰度 gray = img.getpixel((x,y)) unit = 256.0 / length txt += ascii_char[(int)(gray/unit)] txt += '\n' return txt if __name__ == '__main__': txt = convert(readImg()) with open('kai.txt','w') as f: f.write(txt)

 

原圖: 
這裏寫圖片描述

字符: 
這裏寫圖片描述

相關文章
相關標籤/搜索