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 相关文章推荐
使用cx_freeze把python打包exe示例
Jan 24 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
tensorflow实现softma识别MNIST
Mar 12 Python
python如何让类支持比较运算
Mar 20 Python
基于python批量处理dat文件及科学计算方法详解
May 08 Python
Python日志模块logging基本用法分析
Aug 23 Python
Python实现字符串中某个字母的替代功能
Oct 21 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
Apr 16 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
Dec 07 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 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中ini_set和ini_get函数的用法小结
2014/02/18 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
2015/05/09 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
Django学习笔记之Class-Based-View
2017/02/15 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
Django静态文件加载失败解决方案
2020/08/26 Python
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
保证书范文大全
2014/04/28 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
工伤事故赔偿协议书
2014/10/27 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
Apache POI的基本使用详解
2021/11/07 Servers
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript