验证码python代码怎么写,python做验证码
验证码是web开发中不可或缺的元素,python提供了很多验证码模块,帮助你快速生成各种验证码。你知道验证码生成的原理吗?所谓知其然,更知其所以然。今天给大家介绍一下验证码:
演示环境
操作系统:windows10
Python版本:python 3.7
代码编辑:pycharm 2018.2
使用:枕头的第三方模块。
验证码的必须元素
1.一幅画
2.文本
3.干扰元素
线干扰
点干涉
熟悉pillow库
既然需要使用枕头库来制作验证码,那么首先让我们熟悉一下需要使用的方法。
1.Image.new():这个方法可以生成一个有三个参数的图片。
模式:色彩空间模式,可以是‘RGBA’、‘RGB’、‘L’等。
:图片的大小,接收两个整数的祖先。
:图片的填充颜色可以是红色、绿色等。或者rgb的三个整数的祖先。也就是背景色
fromPILimportImage
Captcha=image.new (RGB ,(1080,900),(255,255,255))上面的代码创建了一个颜色空间模式为1080*900,背景为白色的图片。
2.Image.save():将图片保存在本地。
FP:本地文件名
格式:可选参数,指定文件的后缀名称。
fromPILimportImage
captcha=Image.new(RGB ,(1080,900),(255,255,255))
# captcha . save(“captcha . png”)
Captcha.save (captcha ,format= png )以上两种方法的保存效果是一样的。
3.Image.show():要显示图片,会调用电脑自带的显示图片的软件。
4.ImageFont.truetype():加载字体文件。生成一个字体对象。
fromPILimportImageFont
#字体文件路径字体大小
font=image font . truetype( sim kai . TTF ,16) 5。ImageDraw。Draw():生成画笔对象。
fromPILimportImage,ImageDraw
captcha=Image.new(RGB ,(1080,900), red )
Draw=ImageDraw。Draw(captcha)在captcha的图像上创建一个画笔,我们在这个图像中
上画任何东西都会使用这个画笔对象。
6、ImageDraw.Draw().text():在图片上绘制给定的字符
fromPILimportImage,ImageDraw,ImageFont7、ImageDraw.Draw().line():在图片上绘制线条captcha=Image.new('RGB',(1080,900),'red')
font=ImageFont.truetype('simkai.ttf',16)
draw=ImageDraw.Draw(captcha)
#字符绘制位置绘制的字符制定字体字符颜色
draw.text((0,0),'helloworld',font=font,fill='black')
fromPILimportImage,ImageDraw,ImageFont8、ImageDraw.Draw().point():在图片上绘制点captcha=Image.new('RGB',(1080,900),'red')
draw=ImageDraw.Draw(captcha)
#线条起点线条终点
draw.line([(0,0),(1080,900)],fill='black')
fromPILimportImage,ImageDraw,ImageFont制作我们的验证码我们就会使用到上面的方法。当然,pillow肯定不止这些方法,这里我们就只列举这些了。captcha=Image.new('RGB',(1080,900),'red')
font=ImageFont.truetype('simkai.ttf',16)
draw=ImageDraw.Draw(captcha)
#点的位置颜色
draw.point((500,500),fill='black')
制作验证码
1、首先我们定义一个类,初始化一些需要的参数。
importstring这里说一下string模块。classCaptcha():
'''
captcha_size:验证码图片尺寸
font_size:字体大小
text_number:验证码中字符个数
line_number:线条个数
background_color:验证码的背景颜色
sources:取样字符集。验证码中的字符就是随机从这个里面选取的
save_format:验证码保存格式
'''
def__init__(self,captcha_size=(150,100),font_size=30,text_number=4,line_number=4,background_color=(255,
255,255),sources=None,save_format='png'):
self.text_number=text_number
self.line_number=line_number
self.captcha_size=captcha_size
self.background_color=background_color
self.font_size=font_size
self.format=save_format
ifsources:
self.sources=sources
else:
self.sources=string.ascii_letters+string.digits
·string.ascii_letters: 得到a-zA-Z所有字符
·string.digits: 得到0-9所有数字
2、随机从sources获取字符
importrandomrandom.sample()方法:从第一个参数中随机获取字符。获取个数有第二个参数指定。defget_text(self):
text=random.sample(self.sources,k=self.text_number)
return''.join(text)
3、随机获取绘制字符的颜色
defget_font_color(self):4、随机获取干扰线条的颜色font_color=(random.randint(0,150),random.randint(0,150),random.randint(0,150))
returnfont_color
defget_line_color(self):5、编写绘制文字的方法line_color=(random.randint(0,250),random.randint(0,255),random.randint(0,250))
returnline_color
defdraw_text(self,draw,text,font,captcha_width,captcha_height,spacing=20):6、绘制线条的方法'''
在图片上绘制传入的字符
:paramdraw:画笔对象
:paramtext:绘制的所有字符
:paramfont:字体对象
:paramcaptcha_width:验证码的宽度
:paramcaptcha_height:验证码的高度
:paramspacing:每个字符的间隙
:return:
'''
#得到这一窜字符的高度和宽度
text_width,text_height=font.getsize(text)
#得到每个字体的大概宽度
every_value_width=int(text_width/4)
#这一窜字符的总长度
text_length=len(text)
#每两个字符之间拥有间隙,获取总的间隙
total_spacing=(text_length-1)*spacing
iftotal_spacing+text_width>=captcha_width:
raiseValueError("字体加中间空隙超过图片宽度!")
#获取第一个字符绘制位置
start_width=int((captcha_width-text_width-total_spacing)/2)
start_height=int((captcha_height-text_height)/2)
#依次绘制每个字符
forvalueintext:
position=start_width,start_height
print(position)
#绘制text
draw.text(position,value,font=font,fill=self.get_font_color())
#改变下一个字符的开始绘制位置
start_width=start_width+every_value_width+spacing
defdraw_line(self,draw,captcha_width,captcha_height):7、绘制小圆点'''
绘制线条
:paramdraw:画笔对象
:paramcaptcha_width:验证码的宽度
:paramcaptcha_height:验证码的高度
:return:
'''
#随机获取开始位置的坐标
begin=(random.randint(0,captcha_width/2),random.randint(0,captcha_height))
#随机获取结束位置的坐标
end=(random.randint(captcha_width/2,captcha_width),random.randint(0,captcha_height))
draw.line([begin,end],fill=self.get_line_color())
defdraw_point(self,draw,point_chance,width,height):8、制作验证码'''
绘制小圆点
:paramdraw:画笔对象
:parampoint_chance:绘制小圆点的几率概率为point_chance/100
:paramwidth:验证码宽度
:paramheight:验证码高度
:return:
'''
#按照概率随机绘制小圆点
forwinrange(width):
forhinrange(height):
tmp=random.randint(0,100)
iftmp<point_chance:
draw.point((w,h),fill=self.get_line_color())
defmake_captcha(self):这样,我们就生成了我们的图片验证码了,效果图:#获取验证码的宽度,高度
width,height=self.captcha_size
#生成一张图片
captcha=Image.new('RGB',self.captcha_size,self.background_color)
#获取字体对象
font=ImageFont.truetype('simkai.ttf',self.font_size)
#获取画笔对象
draw=ImageDraw.Draw(captcha)
#得到绘制的字符
text=self.get_text(
#绘制字符
self.draw_text(draw,text,font,width,height)
#绘制线条
foriinrange(self.line_number):
self.draw_line(draw,width,height)
#绘制小圆点10是概率10/100,10%的概率
self.draw_point(draw,10,width,height)
#保存图片
captcha.save('captcha',format=self.format)
#显示图片
captcha.show()
代码已全部上传至Github:https://github.com/MiracleYoung/You-are-Pythonista/tree/master/PythonExercise/App/
captcha_project
众多python培训视频,尽在盛行IT软件开发工作室,欢迎在线学习!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。