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,因此咱们只要捕获这个异常就能够了。