PIL:是Python Image Library的缩写,图像处理的模块。Image,ImageFont,ImageDraw,ImageFilter
Image模块:
常用方法:
open() #打开图片 new(mode,size,color) #创建一张空白图片 save("test.gif","GIF") #保存(新图片路径和名称,保存格式) size() #获取图片大小 thumbnail(weight,high) #缩放图片大小(宽,高) show() #显示图片 blend(img1,img2,alpha) #两张图片相加,alpha表示img1和img2的比例参数。 crop() #剪切,提取某个矩阵大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。 rotate(45) #逆时针旋转45度 transpose() #旋转图像 transpose(Image.FLIP_LEFT_RIGHT) #左右对换。 transpose(Image.FLIP_TOP_BOTTOM) #上下对换。 transpose(Image.ROTATE_90) #旋转 90 度角。 transpose(Image.ROTATE_180) #旋转 180 度角。 transpose(Image.ROTATE_270) #旋转 270 度角。 paste(im,box)#粘贴box大小的im到原先的图片对象中。 convert() #用来将图像转换为不同色彩模式。 filters() #滤镜 BLUR #虚化 EMBOSS resize((128,128)) #resize成128*128像素大小 convert("RGBA") #图形类型转换 getpixel((4,4)) #获取某个像素位置的值 putpixel((4,4),(255,0,0)) #写入某个像素位置的值
实例:
import Image,ImageFilter im = Image.open("E:\\QQ2.jpg") #打开图片 w,h = im.size #获取图片的像素,其值为象素意义上的宽和高 print(im.format) #获取图片格式 print(im.size) #获取图片像素 im.thumbnail((w//2,h//2)) #缩放图片大小为原来的一半 im.save("E:\\QQ_backup.jpg",'jpeg') #保存图片,以及保存格式为jpeg #im.show() #显示图片 print(im.mode) #显示模式。 RGB(true color image),此外还有,L(luminance),CMTK(pre-press image)。 box = (100,100,200,200) s = im.crop(box) #图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。 #s.show() #s = s.transpose(Image.ROTATE_180) #旋转180° #im.paste(s,box) #粘贴 #im.show() im = Image.open("E:\\QQ2.jpg") im2 = im.filter(ImageFilter.EMBOSS) im2.save("E:\\QQ_2.jpg",'jpeg') #im2.show() newImg = Image.new("RGBA",(640,480),(0,255,0)) #创建一张大小为640*480颜色为绿色的图片 newImg.save("E:\\newImg.png","PNG")
输出结果为:
JPEG (640, 640) RGB
ImageFont模块:存储bitmap字体,用于ImageDraw类的text()方法。
常用方法:
load() #从指定的文件中加载一种字体,该函数返回对应的字体对象。如果该函数失败,将产生IOError异常。 load_path() #和函数load()一样,但是如果没有指定当前路径的话,会从sys.path开始查找指定的字体文件。 truetype("C:\\Windows\\Fonts\\Arial.ttf", 18) #加载字体对象,并且为指定字体的大小。 load_default() #加载一个默认字体 getsize() #返回给定文本的宽度和高度 getmask() #为给定的文本返回一个位图.如果字体使用了抗锯齿,位图的模式为“L”,且其最大值为255。否则,它的模式为“1”。
ImageDraw模块:
常用方法:
(1)ImageDraw.Draw() #对所有使用ImageDraw操作的图片,要进行对象的创建。 import ImageDraw t = Image.new('RGB',(640,480),'blue') #创建一张新图片 d = ImageDraw.Draw(t) #创建一个可操作对象
(2)t.line([xi,yi,x2,y2],options) #以x1,y1为起点,x2,y2为终点画一条直线,也可以写成(x1,y1,x2,y2)或[(x1,y1),(x2,y2)]。options选项包含的fill选项规定直线的颜色。 import ImageDraw import Image t = Image.new('RGB',(700,700),'yellow') d = ImageDraw.Draw(t) d.line([100,100,100,600],fill=10) d.line((100,100,600,100),fill='red') d.line((600,100,600,600),fill='black') d.line([(100,600),600,600],fill='blue') t.show()
(3)d.arc([x1,y1,x2,y2],startAngle,endAngle,options) #在左上角坐标为x1,y1,右下角坐标为x2,y2的矩形区域内满圆,以startAngle为起始角度,endAngle为终点角度,截取圆的一部分圆弧。如果x1,y1,xw,y2不是正方形,则在该区域内的最大椭圆中根据角度截取片段。 d.arc((100,100,600,600),0,90,fill='red') #画一个上半圆弧 d.arc((100,100,600,400),90,270,fill='blue') #画一个右半椭圆
(4)d.ellipse([x1,y1,x2,y2],options) #用法同arc,用于画圆(或者椭圆)。Options选项中fill表示将圆(或者椭圆)用指定颜色填满,outlie表示只规定圆的颜色。 d.ellipse((100,100,600,600),outline=128) #画一个圆 d.ellipse((100,250,600,450),fill='blue') #在圆里画一个椭圆
(5)d.chord([x1,y1,x2,y2],startAngle,endAngle,options) #用法与arc相同,用来画圆从startAngle到endAngle的弦。Options选项中fill表示将弦与圆弧之间空间用指定颜色填满,outlie表示只规定弦线的颜色。 d.ellipse((100,100,600,600),outline=128) #画圆 d.chord((100,100,600,600),0,90,outline='red') #画一条弦 d.chord((100,100,600,600),90,180,fill='red') #画弦并且将弦与弧区域着色
(6)d.pieslice([x1,y1,x2,y2],startAngle,endAngle,options) #用法与ellipse相同,用于画起始角度间的扇形区域。options选项中fill选项将扇形区域用指定颜色填满,outline选项只用指定颜色描出区域轮廓。 d.ellipse((100,100,600,600),outline=128) #画一个圆 d.pieslice((100,100,600,600),180,210,outline=128) #在圆内画180度到210度的扇形区域轮廓 d.pieslice((100,100,600,600),60,90,fill='blue') #画60度到90度的扇形区域
(7)d.polygon([x1,y1,x2,y2...],options) #根据坐标画多边形,Python会根据第一个参量中的xy坐标对,连接出整个图形。options选项中fill选项将多边形区域用指定颜色填满,outline选项只用指定颜色描出区域轮廓。 d.polygon([(200,200),(600,300),(300,600)],outline = "red") d.polygon([(300,300),(500,300),(300,500),(500,500)],fill = "red") t.show()
(8)d.rectangle([x1,y1,x2,y2],options) #在给定区域内画一个矩形,(x1,y1)表示矩形左上角坐标值,(x2,y2)表示矩形右下角坐标值。options选项中fill选项将多边形区域用指定颜色填满,outline选项只用指定颜色描出区域轮廓。 d.rectangle((200,200,500,500),outline = "red") #画矩阵 d.rectangle((250,300,450,400),fill = 128)
(9)d.text(position, string, options) #Position是一个二元元组,指定字符串左上角坐标,string是要写入的字符串。options选项可以为fill或者font(只能选择其中之一作为第三参量,不能两个同同时存在,要改变字体颜色,见ImageFont模块中的NOTE)。其中fill指定字的颜色,font指定字体与字的尺寸,font必须为ImageFont中指定的font类型,具体用法见ImageFont.Truetype()。 #在空白图像上矩形区域内添加文字 text = "hello, python!" d.rectangle((200,200,500,500),outline = "red") d.text((300,350),text,"red")
实例1:
import Image,ImageFont,ImageDraw image1 = Image.open("WALLPAPER.jpg") draw = ImageDraw.Draw(image1) ft = ImageFont.truetype("C:\\WINDOWS\\Fonts\\STXINGKA.TTF",120) draw.rectangle((180,100,900,900),outline = "red") draw.text((200,400),"www.okorder.com",font=ft,fill="blue") image1.save("new_wallpaper.jpg","JPEG")
实例2:生成验证码
#!/usr/bin/env python # -*- coding:utf-8 -*- import Image, ImageDraw, ImageFont, ImageFilter import random # 随机字母: def rndChar(): return chr(random.randint(65, 90)) # 随机颜色1: def rndColor(): return (random.randint(64, 255), random.randint(64, 255),random.randint(64, 255)) # 随机颜色2: def rndColor2(): return (random.randint(32, 127), random.randint(32, 127),random.randint(32, 127)) # 240 x 60: width = 60 * 4 height = 60 image = Image.new('RGB', (width, height), (255, 255, 255)) # 创建Font对象: font = ImageFont.truetype("C:\\Windows\\Fonts\\Arial.ttf", 36) #注意系统字体的路径 # 创建Draw对象: draw = ImageDraw.Draw(image) # 填充每个像素: for x in range(width): for y in range(height): draw.point((x, y), fill=rndColor()) # 输出文字: for t in range(4): draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2()) # 模糊: image = image.filter(ImageFilter.BLUR) im = image.save('code.jpg', 'jpeg') m = Image.open('code.jpg') m.show()
输出结果为: