Python笔记:利用PIL第三方库生成随机验证码

偏执的太偏执、 2021-12-16 08:37 344阅读 0赞
  1. from PIL import Image,ImageFilter,ImageDraw,ImageFont
  2. from PIL import ImageEnhance
  3. import random
  4. """ 产生随机验证码 """
  5. class Captcha(object):#Captcha:验证码
  6. def __init__(self,size=(100,40),fontSize=30):
  7. self.font=ImageFont.truetype('C:\Windows\Fonts\Arial.ttf',fontSize)#这个函数会加载给定的对象从一个字体文件,并创建字体的字体对象的给定尺寸
  8. self.size=size#将传入的size参数变为对象的实例属性
  9. self.image=Image.new('RGBA',self.size,(255,)*4)#(255,)*4等于(255, 255, 255, 255)
  10. self.texts=self.randNum(5)#随机产生5个数,函数返回的字符串保存在实例属性self.texts
  11. self.outputimage=None#保存输出为jpg图像时,实例变量self.outputimage保存转换后的self.image副本
  12. def rotate(self):#rotate:旋转
  13. rot=self.image.rotate(random.randint(-20,20),expand=0)#将整个self.image逆时针随机旋转一定角度,返回一个新的Image对象,expand:展开可选的扩展标志。如果为TRUE,则扩大输出图像,使其足够大,
  14. #以容纳整个旋转图像,如果是FALSE,则省略,使输出图像和输入图像的大小相同
  15. rot.show()
  16. fff=Image.new('RGBA',rot.size,(255,)*4)
  17. fff.show()
  18. self.image=Image.composite(rot,fff,rot)#函数composite()的功能是使用第三个参数的Image对象来混合第一个参数的Image对象和第二个参数的Image对象。
  19. def randColor(self):#随机产生一个RGB颜色
  20. self.fontColor=(random.randint(0,250),random.randint(0,250),random.randint(0,250))
  21. def randNum(self,bits):#bits控制循环次数
  22. return ''.join(str(random.randint(0,9)) for i in range(bits))#str.join(sequence):参数sequence-->要连接的元素序列,用于将序列中的元素以指定的字符连接生成一个新的字符串。
  23. def write(self,text,x):#x参数为x方向的参数,text为一个一个数字
  24. draw=ImageDraw.Draw(self.image)#创建可用于在给定图像中绘图的对象。注意,图像将在适当的位置进行修改。
  25. draw.text((x,4),text,fill=self.fontColor,font=self.font)#ImageDraw.Draw类的text方法,参数依次为:(x,4)为文字在self.image的左上角位置,需要绘制的文本,关键字参数为填充字体的颜色,字体大小
  26. def writeNum(self):
  27. x=10
  28. xplus=15
  29. for text in self.texts:#self.texts类似'90616'的五个数
  30. self.randColor()
  31. self.write(text,x)#循环每执行完该步,self.image绘制一个不同颜色的随机0-9的数字
  32. self.rotate()#将绘制到self.image图片上的每一个数字随机旋转
  33. x+=xplus
  34. return self.texts
  35. def save(self):
  36. self.outputimage=self.image.convert('RGB')#由于RBGA模式的图像无法保存为jpg图像,所以需要对原始图片格式RGBA转换为RGB,在内存中返回一个新的Image对象
  37. self.outputimage.save('captcha.jpg')
  38. img=Captcha()
  39. num=img.writeNum()#writeNum()调用实例函数rotate(),randColor(),write()
  40. img.save()

本例中使用show()在不同地方打印效果,由于每次python的show()每次调用windows的照片查看器需要几秒,故运行时整个过程较长,不过可在相应语句中查看具体实现效果,便于学习,该程序在该.py文件当前目录生成文件名为captcha.jpg的图片
类似:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,344人围观)

还没有评论,来说两句吧...

相关阅读