Python笔记:利用PIL第三方库生成随机验证码
from PIL import Image,ImageFilter,ImageDraw,ImageFont
from PIL import ImageEnhance
import random
""" 产生随机验证码 """
class Captcha(object):#Captcha:验证码
def __init__(self,size=(100,40),fontSize=30):
self.font=ImageFont.truetype('C:\Windows\Fonts\Arial.ttf',fontSize)#这个函数会加载给定的对象从一个字体文件,并创建字体的字体对象的给定尺寸
self.size=size#将传入的size参数变为对象的实例属性
self.image=Image.new('RGBA',self.size,(255,)*4)#(255,)*4等于(255, 255, 255, 255)
self.texts=self.randNum(5)#随机产生5个数,函数返回的字符串保存在实例属性self.texts中
self.outputimage=None#保存输出为jpg图像时,实例变量self.outputimage保存转换后的self.image副本
def rotate(self):#rotate:旋转
rot=self.image.rotate(random.randint(-20,20),expand=0)#将整个self.image逆时针随机旋转一定角度,返回一个新的Image对象,expand:展开可选的扩展标志。如果为TRUE,则扩大输出图像,使其足够大,
#以容纳整个旋转图像,如果是FALSE,则省略,使输出图像和输入图像的大小相同
rot.show()
fff=Image.new('RGBA',rot.size,(255,)*4)
fff.show()
self.image=Image.composite(rot,fff,rot)#函数composite()的功能是使用第三个参数的Image对象来混合第一个参数的Image对象和第二个参数的Image对象。
def randColor(self):#随机产生一个RGB颜色
self.fontColor=(random.randint(0,250),random.randint(0,250),random.randint(0,250))
def randNum(self,bits):#bits控制循环次数
return ''.join(str(random.randint(0,9)) for i in range(bits))#str.join(sequence):参数sequence-->要连接的元素序列,用于将序列中的元素以指定的字符连接生成一个新的字符串。
def write(self,text,x):#x参数为x方向的参数,text为一个一个数字
draw=ImageDraw.Draw(self.image)#创建可用于在给定图像中绘图的对象。注意,图像将在适当的位置进行修改。
draw.text((x,4),text,fill=self.fontColor,font=self.font)#ImageDraw.Draw类的text方法,参数依次为:(x,4)为文字在self.image的左上角位置,需要绘制的文本,关键字参数为填充字体的颜色,字体大小
def writeNum(self):
x=10
xplus=15
for text in self.texts:#self.texts类似'90616'的五个数
self.randColor()
self.write(text,x)#循环每执行完该步,self.image绘制一个不同颜色的随机0-9的数字
self.rotate()#将绘制到self.image图片上的每一个数字随机旋转
x+=xplus
return self.texts
def save(self):
self.outputimage=self.image.convert('RGB')#由于RBGA模式的图像无法保存为jpg图像,所以需要对原始图片格式RGBA转换为RGB,在内存中返回一个新的Image对象
self.outputimage.save('captcha.jpg')
img=Captcha()
num=img.writeNum()#writeNum()调用实例函数rotate(),randColor(),write()
img.save()
本例中使用show()在不同地方打印效果,由于每次python的show()每次调用windows的照片查看器需要几秒,故运行时整个过程较长,不过可在相应语句中查看具体实现效果,便于学习,该程序在该.py文件当前目录生成文件名为captcha.jpg的图片
类似:
还没有评论,来说两句吧...