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迭代器与生成器详解
Mar 10 Python
python 把文件中的每一行以数组的元素放入数组中的方法
Apr 29 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
Jul 15 Python
PyCharm导入python项目并配置虚拟环境的教程详解
Oct 13 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
python使用Word2Vec进行情感分析解析
Jul 31 Python
Python实现列表索引批量删除的5种方法
Nov 16 Python
python语言time库和datetime库基本使用详解
Dec 25 Python
jupyter notebook更换皮肤主题的实现
Jan 07 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 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 $_SERVER["REQUEST_URI"]获取值的通用解决方法
2010/06/21 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
2015/10/08 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
微信小程序 LOL 英雄介绍开发实例
2016/09/30 Javascript
使用Bootstrap打造特色进度条效果
2017/05/02 Javascript
javascript实现非常简单的小数取整功能示例
2017/06/13 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
Python重新引入被覆盖的自带function
2014/07/16 Python
Python计算程序运行时间的方法
2014/12/13 Python
Python中splitlines()方法的使用简介
2015/05/20 Python
python中列表和元组的区别
2017/12/18 Python
使用pandas的DataFrame的plot方法绘制图像的实例
2018/05/24 Python
基于python实现学生管理系统
2018/10/17 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
深入理解Python变量的数据类型和存储
2021/02/01 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
开学季活动策划方案
2014/02/28 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
mysql部分操作
2021/04/05 MySQL
AI:如何训练机器学习的模型
2021/04/16 Python