python 图片验证码代码


Posted in Python onDecember 07, 2008

下面是一个实战项目的结果。

#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脚本生成Android SALT扰码的方法
Sep 18 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
Mar 19 Python
python删除指定类型(或非指定)的文件实例详解
Jul 06 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
python2.7读取文件夹下所有文件名称及内容的方法
Feb 24 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
对python中矩阵相加函数sum()的使用详解
Jan 28 Python
如何使用python把ppt转换成pdf
Jun 29 Python
python文件转为exe文件的方法及用法详解
Jul 08 Python
python Django编写接口并用Jmeter测试的方法
Jul 31 Python
Python实现将蓝底照片转化为白底照片功能完整实例
Dec 13 Python
pycharm激活码有效到2020年11月底
Sep 18 Python
下载糗事百科的内容_python版
Dec 07 #Python
python 参数列表中的self 显式不等于冗余
Dec 01 #Python
Python GAE、Django导出Excel的方法
Nov 24 #Python
Python类的基础入门知识
Nov 24 #Python
Python 连连看连接算法
Nov 22 #Python
python sqlobject(mysql)中文乱码解决方法
Nov 14 #Python
Python转码问题的解决方法
Oct 07 #Python
You might like
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
javascript 函数速查表
2010/02/07 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
nodejs读写json文件的简单方法(必看)
2017/03/09 NodeJs
深入理解Javascript中的作用域链和闭包
2017/04/25 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
django的model操作汇整详解
2019/07/26 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
缴纳养老保险的证明
2014/01/10 职场文书
理发店策划方案
2014/06/05 职场文书
集中采购方案
2014/06/10 职场文书
公司户外活动总结
2014/07/04 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
初二学生评语大全
2014/12/26 职场文书
保安辞职信范文
2015/02/28 职场文书
心得体会该怎么写呢?
2019/06/27 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
创业计划书详解
2019/07/19 职场文书
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电