越来越觉得PIL的重要性,决定认认真真地学上一两天,嗯~ o( ̄▽ ̄ )o!
PIL 内容基本都是从文档上来的。文档链接 下面这个网站对PIL的介绍很详细,想了解更多可以看这个。PIL
使用Image类 从文件载入,或者句柄载入 1 2 import Imageim = Image.open("lena.ppm" )
1 2 3 import Imagefp = open("lena.ppm" ,"rb" ) im = Image.open(fp)
查看一些对象属性 1 2 print im.format,im.size,im.modePPM (512 ,512 ) RGB
mode如果是L,代表灰度图像,RGB是彩色图像,CMYK是pre-press图像,这个图像是啥,我还不太清楚。
显示图像
对图像进行读写 保存图像 1 im.save(outfile,format,options...)
format如果省略,则python自动按插件识别结果保存。如果没有安装扩展插件,需要明确保存格式。
保存为jpeg格式 1 2 3 4 5 6 7 8 9 10 11 import os,sysimport Imagefor infile in sys.argv[1 :]: f,e = os.path.splitext(infile) outfile = f + ".jpg" if outfile != infile: try : image.open(infile).save(outfile) except IOError: print "cannot convert" ,infile
上述代码将把命令行读入的所有指定文件保存为jpg格式,不能保存的抛出异常。
图像缩放 1 2 3 4 5 6 7 8 9 10 11 12 13 import sysimport Imagesize = 128 ,128 for infile in sys.argv[1 :]: outfile = os.path.splitext(infile)[0 ] + ".thumbnail" try : im = Image.open(infile) im.thumbnail(size) im.save(outfile,"jpeg" ) except : print "cannot create thumbnail for" ,infile
截取,粘贴,融合图像 截取图像的一部分 使用crop方法从一张图片上截取子矩形
1 2 box = (100 ,100 ,400 ,400 ) region = im.crop(box)
从左上角到右下角
旋转180,再贴回去 1 2 region = region.transpose(Image.ROTATE_180) im.paste(region,box)
滚动图像(交换图像位置) 1 2 3 4 5 6 7 8 9 10 11 12 13 def roll (image,delta) : 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)) image.paste(part2,(0 ,0 ,xsize - delta,ysize)) image.paste(part1,(xsize - delta,0 ,xsize,ysize)) return image
分割RGB 1 2 r,g,b = im.split() im = Image.merge("RGB" ,(b,g,r))
几何变换 简单变换 1 2 out = im.resize(128 ,128 ) out = im.rotate(45 )
变换图像 1 2 3 4 5 out = im.transpose(Image.FLIP_LEFT_RIGHT) out = im.transpose(Image.FLIP_TOP_BOTTOM) out = im.transpose(Image.ROTATE_90) out = im.transpose(Image.ROTATE_180) out = im.transpose(Image.ROTATE_270)
颜色变换(在不同mode下转换) 1 im = Image.open("lena.ppm" ).convert("L" )
滤镜 1 2 import ImageFilterout = im.filter(ImageFilter.DETAIL)
有很多滤镜的功能,在ImageFilter模块里,具体可以参考文档。ImageFilter
点操作(提取不同通道像素) 读取每一帧 1 2 3 4 5 6 7 8 import Imageim = Image.open("animation.gif" ) try : im.seek(im.tell() + 1 ) im.save(str(im.tell()) + ".jpg" ) except EOFError: pass