首页IT科技python编写验证码(想用Python生成验证码,还得看这篇文章)

python编写验证码(想用Python生成验证码,还得看这篇文章)

时间2025-04-30 20:24:30分类IT科技浏览3462
导读:验证码是web开发中不可缺少的元素,而python又提供了非常多的验证码模块帮助大家快速生成各种验证码。那你知道验证码生成的原理吗?所谓知其然,还要知其所以然。今天给大家介绍一下验证码:...

验证码是web开发中不可缺少的元素          ,而python又提供了非常多的验证码模块帮助大家快速生成各种验证码          。那你知道验证码生成的原理吗?所谓知其然                ,还要知其所以然                。今天给大家介绍一下验证码:

演示环境

·操作系统:windows10

·python版本:python 3.7

·代码编辑器:pycharm 2018.2

·使用第三方模块:pillow

验证码的必须元素

1.一张图片

2.文本

3.干扰元素

·线条干扰

·小圆点干扰

熟悉pillow库

我们既然需要使用pillow库制作验证码      ,那么首先我们先来熟悉一下我们需要用到的方法      。

1          、Image.new():这个方法可以生成一张图片          ,有三个参数          。

·mode:颜色空间模式               ,可以是RGBA,RGB,L等等模式

·size:图片尺寸      ,接收一个两个整数的元祖

·color:图片的填充颜色     ,可以是red               ,green等           ,也可以是rgb的三个整数的元祖               。也就是背景颜色

fromPILimportImage captcha=Image.new(RGB,(1080,900),(255,255,255))

上面代码创建了一个亿RGB为颜色空间模式     ,尺寸为1080*900               ,背景颜色为白色的图片      。

2                、Image.save():保存图片到本地

·fp:本地文件名

·format:可选参数           ,制定文件后缀名     。

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=ImageFont.truetype(simkai.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,ImageFont 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)

7     、ImageDraw.Draw().line():在图片上绘制线条

fromPILimportImage,ImageDraw,ImageFont captcha=Image.new(RGB,(1080,900),red) draw=ImageDraw.Draw(captcha) #线条起点线条终点 draw.line([(0,0),(1080,900)],fill=black)

8               、ImageDraw.Draw().point():在图片上绘制点

fromPILimportImage,ImageDraw,ImageFont captcha=Image.new(RGB,(1080,900),red) font=ImageFont.truetype(simkai.ttf,16) draw=ImageDraw.Draw(captcha) #点的位置颜色 draw.point((500,500),fill=black)

制作我们的验证码我们就会使用到上面的方法               。当然                ,pillow肯定不止这些方法,这里我们就只列举这些了                。

制作验证码

1           、首先我们定义一个类          ,初始化一些需要的参数。

importstring 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模块                。

·string.ascii_letters: 得到a-zA-Z所有字符

·string.digits: 得到0-9所有数字

2     、随机从sources获取字符

importrandom defget_text(self): text=random.sample(self.sources,k=self.text_number) return.join(text)

random.sample()方法:从第一个参数中随机获取字符      。获取个数有第二个参数指定          。

3               、随机获取绘制字符的颜色

defget_font_color(self): font_color=(random.randint(0,150),random.randint(0,150),random.randint(0,150)) returnfont_color

4           、随机获取干扰线条的颜色

defget_line_color(self): line_color=(random.randint(0,250),random.randint(0,255),random.randint(0,250)) returnline_color

5、编写绘制文字的方法

defdraw_text(self,draw,text,font,captcha_width,captcha_height,spacing=20): 在图片上绘制传入的字符 :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

6               、绘制线条的方法

defdraw_line(self,draw,captcha_width,captcha_height): 绘制线条 :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())

7                、绘制小圆点

defdraw_point(self,draw,point_chance,width,height): 绘制小圆点 :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())

8、制作验证码

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

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
搜索框无法搜索到某些应用怎么回事(搜索框无法搜索到某些应用) python把图片转为素描(python如何将图片转换成黑白?)