friendly fork for PIL
,其功能和PIL差很少,可是支持python3。本文主要介紹PIL那些最經常使用的特性與用法,主要參考自:http://www.effbot.org/imagingbook。>>> from PIL import Image >>> Image.open("dog.jpg","r") <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=296x299 at 0x7F62BDB5B0F0 > >>> im = Image.open("dog.jpg","r") >>> print(im.size,im.format,im.mode) (296, 299) JPEG RGB
Image.open
返回一個Image對象,該對象有size,format,mode
等屬性,其中size
表示圖像的寬度和高度(像素表示);format
表示圖像的格式,常見的包括JPEG,PNG等格式;mode
表示圖像的模式,定義了像素類型還有圖像深度等,常見的有RGB,HSV等。通常來講'L'(luminance)表示灰度圖像,'RGB'表示真彩圖像,'CMYK'表示預先壓縮的圖像。一旦你獲得了打開的Image對象以後,就可使用其衆多的方法對圖像進行處理了,好比使用im.show()
能夠展現上面獲得的圖像。python
>>> im.save("dog.png",'png')
上面的代碼將圖像從新保存成png格式。框架
>>> im.thumbnail((50,50),resample=Image.BICUBIC) >>> im.show()
上面的代碼能夠建立一個指定大小(size)的縮略圖,須要注意的是,thumbnail方法是原地操做,返回值是None。第一個參數是指定的縮略圖的大小,第二個是採樣的,有Image.BICUBIC
,PIL.Image.LANCZOS
,PIL.Image.BILINEAR
,PIL.Image.NEAREST
這四種採樣方法。默認是Image.BICUBIC
。函數
>>> im = Image.open("dog.jpg","r") >>> box = (100,100,200,200) >>> region = im.crop(box) >>> region.show() im.crop()
上面的代碼在im圖像上裁剪了一個box矩形區域,而後顯示出來。box是一個有四個數字的元組(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分別表示裁剪矩形區域的左上角x,y座標,右下角的x,y座標,規定圖像的最左上角的座標爲原點(0,0),寬度的方向爲x軸,高度的方向爲y軸,每個像素表明一個座標單位。crop()返回的仍然是一個Image對象。code
>>> im_rotate_180 = im.transpose(Image.ROTATE_180) >>> im_rotate_180.show()
上面的代碼將im逆時針旋轉180°,而後顯示出來,method
是transpose的參數,表示選擇什麼樣的翻轉或者旋轉方式,能夠選擇的值有:
- Image.FLIP_LEFT_RIGHT,表示將圖像左右翻轉
- Image.FLIP_TOP_BOTTOM,表示將圖像上下翻轉
- Image.ROTATE_90,表示將圖像逆時針旋轉90°
- Image.ROTATE_180,表示將圖像逆時針旋轉180°
- Image.ROTATE_270,表示將圖像逆時針旋轉270°
- Image.TRANSPOSE,表示將圖像進行轉置(至關於順時針旋轉90°)
- Image.TRANSVERSE,表示將圖像進行轉置,再水平翻轉orm
>>> im.paste(region,(100,100),None) >>> im.show()
上面的代碼將region圖像粘貼到左上角爲(100,100)的位置。region是要粘貼的Image對象,box是要粘貼的位置,能夠是一個兩個元素的元組,表示粘貼區域的左上角座標,也能夠是一個四個元素的元組,表示左上角和右下角的座標。若是是四個元素元組的話,box的size必需要和region的size保持一致,不然將會被convert成和region同樣的size。對象
>>> r,g,b = im.split() >>> r.show() >>> g.show() >>> b.show()
split()方法能夠原來圖像的各個通道分離,好比對於RGB圖像,能夠將其R,G,B三個顏色通道分離。接口
>>> im_merge = Image.merge("RGB",[b,r,g]) >>> im_merge.show()
merge方法和split方法是相對的,其將多個單一通道的序列合併起來,組成一個多通道的圖像,mode是合併以後圖像的模式,好比"RGB",channels是多個單一通道組成的序列。ip
>>> im_resize = im.resize((200,200)) >>> im_resize <PIL.Image.Image image mode=RGB size=200x200 at 0x7F62B9E23470> >>> im_resize.show() >>> im_resize_box = im.resize((100,100),box = (0,0,50,50)) >>> im_resize_box.show()
resize方法能夠將原始的圖像轉換大小,size是轉換以後的大小,resample是從新採樣使用的方法,仍然有Image.BICUBIC
,PIL.Image.LANCZOS
,PIL.Image.BILINEAR
,PIL.Image.NEAREST
這四種採樣方法,默認是PIL.Image.NEAREST
,box是指定的要resize的圖像區域,是一個用四個元組指定的區域(含義和上面所述box一致)。get
>>> im_L = im.convert("L") >>> im_L.show() >>> im_rgb = im_L.convert("RGB") >>> im_rgb.show() >>> im_L.mode 'L' >>> im_rgb.mode 'RGB'
convert方法能夠改變圖像的mode,通常是在'RGB'(真彩圖)、'L'(灰度圖)、'CMYK'(壓縮圖)之間轉換。上面的代碼就是首先將圖像轉化爲灰度圖,再從灰度圖轉化爲真彩圖。值得注意的是,從灰度圖轉換爲真彩圖,雖然理論上確實轉換成功了,可是其實是很難恢復成原來的真彩模式的(不惟一)。it
>>> im = Image.open("dog.jpg","r") >>> from PIL import ImageFilter >>> im_blur = im.filter(ImageFilter.BLUR) >>> im_blur.show() >>> im_find_edges = im.filter(ImageFilter.FIND_EDGES) >>> im_find_edges.show() >>> im_find_edges.save("find_edges.jpg") >>> im_blur.save("blur.jpg")
filter方法能夠將一些過濾器操做應用於原始圖像,好比模糊操做,查找邊、角點操做等。filter是過濾器函數,在PIL.ImageFilter
函數中定義了大量內置的filter函數,好比BLUR
(模糊操做),GaussianBlur
(高斯模糊),MedianFilter
(中值過濾器),FIND_EDGES
(查找邊)等。上面獲得原始圖像dog.jpg,find_edges.jpg以及blur.jpg從左到右以下圖1所示:
>>> im_point = im.point(lambda x:x*1.5) >>> im_point.show() >>> im_point.save("im_point.jpg")
point方法能夠對圖像進行單個像素的操做,上面的代碼對point方法傳入了一個匿名函數,表示將圖像的每一個像素點大小都乘以1.5,mode是返回的圖像的模式,默認是和原來圖像的mode是同樣的。圖2是原來的dog.jpg和point操做以後的im_point.jpg之間的對比。
point
函數,
split
函數,
paste
函數以及
merge
函數的小例子。
>>> source = im.split() >>> R,G,B = 0,1,2 >>> mask = source[R].point(lambda x: x<100 and 255) >>> # x<100,return 255,otherwise return 0 >>> out_G = source[G].point(lambda x:x*0.7) >>> # 將out_G粘貼回來,可是隻保留'R'通道像素值<100的部分 >>> source[G].paste(out_G,None,mask) >>> # 合併成新的圖像 >>> im_new = Image.merge(im.mode,source) >>> im_new.show() >>> im.show()
>>> from PIL import ImageEnhance >>> brightness = ImageEnhanBce.Brightness(im) >>> im_brightness = brightness.enhance(1.5) >>> im_brightness.show() >>> im_contrast = ImageEnhance.Contrast(im) >>> im_contrast.enhance(1.5) <PIL.Image.Image image mode=RGB size=296x299 at 0x7F62AE271AC8> >>> im_contrast.enhance(1.5).show()
ImageEnhance是PIL下的一個子類,主要用於圖像加強,好比增長亮度(Brightness),增長對比度(Contrast)等。上面的代碼將原來圖像的亮度增長50%,將對比度也增長了50%。
>>> from PIL import ImageSequence >>> from PIL import Image >>> gif = Image.open("pipixia.gif") >>> for i,frame in enumerate(ImageSequence.Iterator(gif),1): ... if frame.mode == 'JPEG': ... frame.save("%d.jpg" %i) ... else: ... frame.save("%d.png" % i)
除了上面使用迭代器的方式之外,還能夠一幀一幀讀取gif,好比下面的代碼:
>>> index = 0 >>> while 1: ... try: ... gif.seek(index) ... gif.save("%d.%s" %(index,'jpg' if gif.mode == 'JPEG' else 'png')) ... index += 1 ... except EOFError: ... print("Reach the end of gif sequence!") ... break
上面的代碼在讀取到gif的最後一幀以後,會throw 一個 EOFError,因此咱們只要捕獲這個異常就能夠了。