python 图片验证码代码分享


Posted in Python onJuly 04, 2012
#coding: utf-8 
import Image,ImageDraw,ImageFont,os,string,random,ImageFilter 
def initChars(): 
""" 
允许的字符集合,初始集合为数字、大小写字母 
usage: initChars() 
param: None 
return: list 
返回允许的字符集和 
for: picChecker类初始字符集合 
todo: Nothing 
""" 
nums = [str(i) for i in range(10)] 
letterCase = [ 
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 
'w', 'x', 'y', 'z' 
] 
upperCase = [ 
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 
'W', 'X', 'Y', 'Z', 
] 
return(nums+letterCase+upperCase) 
class picChecker(): 
"""

图片验证代码:
1) 用户注册需填写图片验证码,以阻止机器人注册
2) 图片验证码字符数为 4 位(大小写字母与数字,不区分大小写)。
用户如果没有填写验证码或没有填写正确的验证码,
页面友好性提示用户填写(同时程序方面也做相应限制)
usage: pc = picChecker().createChecker()
param: 很多,如下
chars 允许的字符集合,
类型 list
默认值 initChars()
例子 ['1','2','3']
length 字符串长度
类型 integer
默认值 4
size 图片大小
类型 tutle
默认值 (120,30)
例子 (120,30)
fontsize 字体大小
类型 integer
默认值 25
begin 字符其实位置,即左上角位置
类型 tutle
默认值 (5,-2)
outputType 输出类型
类型 string
默认值 GIF
可选值 GIF JPEG TIFF PNG
mode 图片模式
类型 string
可选值 RGB L (还有其他模式,但只推荐这2种)
默认值 RGB
backgroundColor 背景色
foregroundColor 前景色
当mode=RGB时,backgroundColor,foregroundColor为tutle类型
取值为(integer,integer,integer)
表示RGB颜色值
当mode=L时,backgroundColor,foregroundColor为数字,表示黑白模式
取值为0-255
表示灰度
fonttype 字体路径
类型 string
默认值 "simsum.ttc"
jamNum 干扰线条数
类型 (int1,int1)
int1 干扰线条数下限,包含
int2 干扰线条数上线,包含
pointBorder 散点噪音
构造方法:对每个像素点使用随机函数确定是否在该像素上画散点噪音
类型 (int1,int2)
int1越大 散点越多
int2越大 散点越少
return: [picCheckerStr,pic]
picCheckerStr: 表示返回图片中对应的字符串,可用于session验证以及其他用途
pic : 返回的图片,类型为Image
for :
todo : Nothing
"""
#默认字体路径
#DEFAULT_FONT_PATH = os.path.join(os.path.dirname(__file__),'simsun.ttc').replace('\\','/')
def __init__(self,chars = initChars(),size = (120,30),fontsize = 25,
begin = (5,-2),outputType = 'GIF',mode = 'RGB' ,
backgroundColor = (255,255,255), foregroundColor = (0,0,255),
fonttype = "simsun.ttc",length = 4,jamNum = (1,2),
pointBorder = (40,39)):
"""
初始化配置
"""
#验证码配置
#允许的字符串
self.chars = chars
#图片大小
self.size = size
#字符起始插入点
self.begin = begin
#字符串长度
self.length = length
#输出类型
self.outputType = outputType
#字符大小
self.fontsize = fontsize
#图片模式
self.mode = mode
#背景色
self.backgroundColor = backgroundColor
#前景色
self.foregroundColor = foregroundColor
#干扰线条数
self.jamNum = jamNum
#散点噪音界限
self.pointBorder = pointBorder
#字体库路径
self.fonttype = fonttype
#设置字体,大小默认为18
self.font = ImageFont.truetype(self.fonttype, self.fontsize)
def getPicString(self):
"""
usage: getPicString()
return: string
for : 生成给定长度的随机字符串
todo: Nothing
"""
#初始化字符串长度
length = self.length
#初始化字符集合
chars = self.chars
#获得字符集合
selectedChars = random.sample(chars,length)
charsToStr = string.join(selectedChars,'')
return(charsToStr)
def createChecker(self):
"""
usage: createChecker()
return: [str,pic]
str:对应的字符串
pic:对应的图片
for:
todo:
"""
#获得验证码字符串
randStr = self.getPicString()
#将字符串加入空格
randStr1 = string.join([i+" " for i in randStr],"")
#创建图形
im = Image.new(self.mode,self.size,self.backgroundColor)
#创建画笔
draw = ImageDraw.Draw(im)
#输出随机文本
draw.text(self.begin, randStr1, font=self.font,fill=self.foregroundColor)
#im = self.drawText(draw,randStr,im)
#干扰线
self.createJam(draw)
#散点噪音
self.createPoints(draw)
#图形扭曲
para = [1-float(random.randint(1,2))/100,
0,
0,
0,
1-float(random.randint(1,10))/100,
float(random.randint(1,2))/500,
0.001,
float(random.randint(1,2))/500
]
#print randStr,para
im = im.transform(im.size, Image.PERSPECTIVE,para)
#图像滤镜
im=im.filter(ImageFilter.EDGE_ENHANCE_MORE)
im.save("checker.jpg",self.outputType)
return([randStr,im])
def createJam(self,draw):
"""
usage: 创建干扰线
para: draw 表示画笔
return: None
for:
todo:
"""
#干扰线条数
lineNum = random.randint(self.jamNum[0],self.jamNum[1])
for i in range(lineNum):
begin = (random.randint(0,self.size[0]),random.randint(0,self.size[1]))
end = (random.randint(0,self.size[0]),random.randint(0,self.size[1]))
draw.line([begin,end],fill = (0,0,0))
def createPoints(self,draw):
"""
usage: 创建散点噪音
para: draw 表示画笔
return: None
for:
todo:
"""
#散点噪音
for x in range(self.size[0]):
for y in range(self.size[1]):
flag = random.randint(0,self.pointBorder[0])
if flag > self.pointBorder[1]:
draw.point((x,y),fill = (0,0,0))
del flag
if __name__ == '__main__':
c=picChecker()
t=c.createChecker()
print(t)
Python 相关文章推荐
Python3.2中Print函数用法实例详解
May 19 Python
Python如何获取系统iops示例代码
Sep 06 Python
PyQt5打开文件对话框QFileDialog实例代码
Feb 07 Python
python 限制函数执行时间,自己实现timeout的实例
Jan 12 Python
Python3.5装饰器典型案例分析
Apr 30 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
Python如何优雅获取本机IP方法
Nov 10 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
python实现邮件循环自动发件功能
Sep 11 Python
python实现简单区块链结构
Apr 25 Python
python正则表达式re.search()的基本使用教程
May 21 Python
Python查询Mysql时返回字典结构的代码
Jun 18 #Python
python 实现堆排序算法代码
Jun 05 #Python
python 实现归并排序算法
Jun 05 #Python
python 实现插入排序算法
Jun 05 #Python
python 算法 排序实现快速排序
Jun 05 #Python
python操作MySQL数据库的方法分享
May 29 #Python
python利用elaphe制作二维条形码实现代码
May 25 #Python
You might like
PHP中extract()函数的妙用分析
2012/07/11 PHP
php使用codebase生成随机数
2014/03/25 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
Javascript学习笔记1 数据类型
2010/01/11 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
5分钟快速掌握JS中var、let和const的异同
2018/09/19 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
Python科学计算之Pandas详解
2017/01/15 Python
python实现求解列表中元素的排列和组合问题
2018/03/15 Python
机器学习之KNN算法原理及Python实现方法详解
2018/07/09 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
机械工程系毕业生求职信
2013/09/27 职场文书
甜点店创业计划书
2014/01/27 职场文书
小学三八妇女节活动方案
2014/03/16 职场文书
小学一年级学生评语
2014/04/22 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
寻找成龙观后感
2015/06/12 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书