python生成验证码图片代码分享


Posted in Python onJanuary 28, 2016

本文实例为大家分享了python生成验证码图片代码,分享给大家供大家参考,具体内容如下

基本上大家使用每一种网络服务都会遇到验证码,一般是网站为了防止恶意注册、发帖而设置的验证手段。其生成原理是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR)。下面就详细讲解如何生成验证码。

所需环境

除了配置好的python环境外,还需要配有python中的PIL库,这是python中专门用来处理图片的库。用传统的pip install 方法或者下载源码 python setup.py install 方法安装该库,很可能会报错(视运行环境不同)。可以采用下面这个方法

  • 1.下载安装包URL,要下载支持全平台的。
  • 2.解压缩: tar ?zxv ?f Imaging-1.1.7.tar.gz
  • 3.进入到解压后的目录: cd Imaging-1.1.7
  • 4.Bulid pakage:python setup.py build_ext ?i
  • 5.测试:python selftest.py
  • 6.安装:python setup.py install

代码实现

要生成验证码图片,我们首先要生成一个随机字符串,包含26个字母和10个数字。

#用来随机生成一个字符串
def gene_text():
 source = list(string.letters)
 for index in range(0,10):
  source.append(str(index))
 return ''.join(random.sample(source,number))#number是生成验证码的位数

然后我们要创建一个图片,写入字符串,需要说明的这里面的字体是不同系统而定,如果没有找到系统字体路径的话,也可以不设置

def gene_code():
 width,height = size #宽和高
 image = Image.new('RGBA',(width,height),bgcolor) #创建图片
 font = ImageFont.truetype(font_path,25) #验证码的字体和字体大小
 draw = ImageDraw.Draw(image) #创建画笔
 text = gene_text() #生成字符串
 font_width, font_height = font.getsize(text)
 draw.text(((width - font_width) / number, (height - font_height) / number),text,\
   font= font,fill=fontcolor) #填充字符串

接下来,我们要在图片上画几条干扰线

#用来绘制干扰线
def gene_line(draw,width,height):
 begin = (random.randint(0, width), random.randint(0, height))
 end = (random.randint(0, width), random.randint(0, height))
 draw.line([begin, end], fill = linecolor)

最后创建扭曲,加上滤镜,用来增强验证码的效果。

image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
 image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强
 image.save('idencode.png') #保存验证码图片

下面是用上述程序生成的一个验证码

python生成验证码图片代码分享

下面是完整的代码:

#coding=utf-8
import random
import string
import sys
import math
from PIL import Image,ImageDraw,ImageFont,ImageFilter

#字体的位置,不同版本的系统会有不同
font_path = '/Library/Fonts/Arial.ttf'
#生成几位数的验证码
number = 4
#生成验证码图片的高度和宽度
size = (100,30)
#背景颜色,默认为白色
bgcolor = (255,255,255)
#字体颜色,默认为蓝色
fontcolor = (0,0,255)
#干扰线颜色。默认为红色
linecolor = (255,0,0)
#是否要加入干扰线
draw_line = True
#加入干扰线条数的上下限
line_number = (1,5)

#用来随机生成一个字符串
def gene_text():
 source = list(string.letters)
 for index in range(0,10):
  source.append(str(index))
 return ''.join(random.sample(source,number))#number是生成验证码的位数
#用来绘制干扰线
def gene_line(draw,width,height):
 begin = (random.randint(0, width), random.randint(0, height))
 end = (random.randint(0, width), random.randint(0, height))
 draw.line([begin, end], fill = linecolor)

#生成验证码
def gene_code():
 width,height = size #宽和高
 image = Image.new('RGBA',(width,height),bgcolor) #创建图片
 font = ImageFont.truetype(font_path,25) #验证码的字体
 draw = ImageDraw.Draw(image) #创建画笔
 text = gene_text() #生成字符串
 font_width, font_height = font.getsize(text)
 draw.text(((width - font_width) / number, (height - font_height) / number),text,\
   font= font,fill=fontcolor) #填充字符串
 if draw_line:
  gene_line(draw,width,height)
 # image = image.transform((width+30,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
 image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
 image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强
 image.save('idencode.png') #保存验证码图片
if __name__ == "__main__":
 gene_code()

以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。

Python 相关文章推荐
在Python的gevent框架下执行异步的Solr查询的教程
Apr 16 Python
为Python程序添加图形化界面的教程
Apr 29 Python
django2用iframe标签完成网页内嵌播放b站视频功能
Jun 20 Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 Python
mac系统下Redis安装和使用步骤详解
Jul 09 Python
python3.7 sys模块的具体使用
Jul 22 Python
python分割一个文本为多个文本的方法
Jul 22 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
使用celery和Django处理异步任务的流程分析
Feb 19 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
Jun 02 Python
python使用Word2Vec进行情感分析解析
Jul 31 Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 Python
详解Python网络爬虫功能的基本写法
Jan 28 #Python
Python3实现Web网页图片下载
Jan 28 #Python
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 #Python
Python每天必学之bytes字节
Jan 28 #Python
Python装饰器入门学习教程(九步学习)
Jan 28 #Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 #Python
使用Python写个小监控
Jan 27 #Python
You might like
PHP也可以?成Shell Script
2006/10/09 PHP
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
解决Laravel无法使用COOKIE和SESSION的问题
2019/10/16 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
2018/10/19 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
用实例说明python的*args和**kwargs用法
2013/11/01 Python
简单介绍Python中的JSON模块
2015/04/08 Python
Python实现线程池代码分享
2015/06/21 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
python2.7实现爬虫网页数据
2018/05/25 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Python的log日志功能及设置方法
2019/07/11 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
Pytorch 使用 nii数据做输入数据的操作
2020/05/26 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
师范生实习个人的自我评价
2013/09/28 职场文书
政风行风整改报告
2014/11/06 职场文书
导游词之珠海轮廓
2019/10/25 职场文书