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)
r,g,b = im.split() #分離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)
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幀內容
from PIL import ImageSequence #導入ImageSequence for frame in ImageSequence.Iterator(im): #使用迭代器 im.show() #顯示各幀圖片
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)
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)
附件:原圖