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 相关文章推荐
Python socket C/S结构的聊天室应用实现
Nov 30 Python
Python的Django中django-userena组件的简单使用教程
May 30 Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
解决Spyder中图片显示太小的问题
Apr 27 Python
对python:threading.Thread类的使用方法详解
Jan 31 Python
详解python中init方法和随机数方法
Mar 13 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
python中必要的名词解释
Nov 20 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
python time.strptime格式化实例详解
Feb 03 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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
Zerg建筑一览
2020/03/14 星际争霸
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
javascript中xml操作实现代码
2011/11/21 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
利用JS提交表单的几种方法和验证(必看篇)
2016/09/17 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
深入koa-bodyparser原理解析
2019/01/16 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
python字符串,数值计算
2016/10/05 Python
Python实现文件内容批量追加的方法示例
2017/08/29 Python
详解python eval函数的妙用
2017/11/16 Python
Python内置函数——__import__ 的使用方法
2017/11/24 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
PyQt5实现登录页面
2020/05/30 Python
UI自动化定位常用实现方法代码示例
2020/10/27 Python
如何用用Python将地址标记在地图上
2021/02/07 Python
送给程序员的20个Java集合面试问题
2014/08/06 面试题
高中毕业生个人自我鉴定
2013/11/24 职场文书
教育局长自荐信范文
2013/12/22 职场文书
交通安全寄语大全
2014/04/08 职场文书
合同意向书范本
2014/07/30 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
《詹天佑》教学反思
2016/02/20 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL