python生成验证码图片代码分享


Posted in Python onJanuary 28, 2016

本文实例为大家分享了python生成验证码图片代码,分享给大家供大家参考,具体内容如下

基本上大家使用每一种网络服务都会遇到验证码,一般是网站为了防止恶意注册、发帖而设置的验证手段。其生成原理是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR)。下面就详细讲解如何生成验证码。

所需环境

除了配置好的python环境外,还需要配有python中的PIL库,这是python中专门用来处理图片的库。用传统的pip install 方法或者下载源码 python setup.py install 方法安装该库,很可能会报错(视运行环境不同)。可以采用下面这个方法

  • 1.下载安装包URL,要下载支持全平台的。
  • 2.解压缩: tar ?zxv ?f Imaging-1.1.7.tar.gz
  • 3.进入到解压后的目录: cd Imaging-1.1.7
  • 4.Bulid pakage:python setup.py build_ext ?i
  • 5.测试:python selftest.py
  • 6.安装:python setup.py install

代码实现

要生成验证码图片,我们首先要生成一个随机字符串,包含26个字母和10个数字。

#用来随机生成一个字符串
def gene_text():
 source = list(string.letters)
 for index in range(0,10):
  source.append(str(index))
 return ''.join(random.sample(source,number))#number是生成验证码的位数

然后我们要创建一个图片,写入字符串,需要说明的这里面的字体是不同系统而定,如果没有找到系统字体路径的话,也可以不设置

def gene_code():
 width,height = size #宽和高
 image = Image.new('RGBA',(width,height),bgcolor) #创建图片
 font = ImageFont.truetype(font_path,25) #验证码的字体和字体大小
 draw = ImageDraw.Draw(image) #创建画笔
 text = gene_text() #生成字符串
 font_width, font_height = font.getsize(text)
 draw.text(((width - font_width) / number, (height - font_height) / number),text,\
   font= font,fill=fontcolor) #填充字符串

接下来,我们要在图片上画几条干扰线

#用来绘制干扰线
def gene_line(draw,width,height):
 begin = (random.randint(0, width), random.randint(0, height))
 end = (random.randint(0, width), random.randint(0, height))
 draw.line([begin, end], fill = linecolor)

最后创建扭曲,加上滤镜,用来增强验证码的效果。

image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
 image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强
 image.save('idencode.png') #保存验证码图片

下面是用上述程序生成的一个验证码

python生成验证码图片代码分享

下面是完整的代码:

#coding=utf-8
import random
import string
import sys
import math
from PIL import Image,ImageDraw,ImageFont,ImageFilter

#字体的位置,不同版本的系统会有不同
font_path = '/Library/Fonts/Arial.ttf'
#生成几位数的验证码
number = 4
#生成验证码图片的高度和宽度
size = (100,30)
#背景颜色,默认为白色
bgcolor = (255,255,255)
#字体颜色,默认为蓝色
fontcolor = (0,0,255)
#干扰线颜色。默认为红色
linecolor = (255,0,0)
#是否要加入干扰线
draw_line = True
#加入干扰线条数的上下限
line_number = (1,5)

#用来随机生成一个字符串
def gene_text():
 source = list(string.letters)
 for index in range(0,10):
  source.append(str(index))
 return ''.join(random.sample(source,number))#number是生成验证码的位数
#用来绘制干扰线
def gene_line(draw,width,height):
 begin = (random.randint(0, width), random.randint(0, height))
 end = (random.randint(0, width), random.randint(0, height))
 draw.line([begin, end], fill = linecolor)

#生成验证码
def gene_code():
 width,height = size #宽和高
 image = Image.new('RGBA',(width,height),bgcolor) #创建图片
 font = ImageFont.truetype(font_path,25) #验证码的字体
 draw = ImageDraw.Draw(image) #创建画笔
 text = gene_text() #生成字符串
 font_width, font_height = font.getsize(text)
 draw.text(((width - font_width) / number, (height - font_height) / number),text,\
   font= font,fill=fontcolor) #填充字符串
 if draw_line:
  gene_line(draw,width,height)
 # image = image.transform((width+30,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
 image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
 image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强
 image.save('idencode.png') #保存验证码图片
if __name__ == "__main__":
 gene_code()

以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。

Python 相关文章推荐
10种检测Python程序运行时间、CPU和内存占用的方法
Apr 01 Python
利用Pandas 创建空的DataFrame方法
Apr 08 Python
windows下添加Python环境变量的方法汇总
May 14 Python
Python Logging 日志记录入门学习
Jun 02 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 Python
python使用Plotly绘图工具绘制水平条形图
Mar 25 Python
python并发编程 Process对象的其他属性方法join方法详解
Aug 20 Python
Python使用matplotlib 模块scatter方法画散点图示例
Sep 27 Python
django跳转页面传参的实现
Sep 17 Python
python cookie反爬处理的实现
Nov 01 Python
matplotlib绘制正余弦曲线图的实现
Feb 22 Python
详解Python网络爬虫功能的基本写法
Jan 28 #Python
Python3实现Web网页图片下载
Jan 28 #Python
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 #Python
Python每天必学之bytes字节
Jan 28 #Python
Python装饰器入门学习教程(九步学习)
Jan 28 #Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 #Python
使用Python写个小监控
Jan 27 #Python
You might like
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
让FireFox支持innerText的实现代码
2009/12/01 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
微信小程序 共用变量值的实现
2017/07/12 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
2017/07/30 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
Python 装饰器深入理解
2017/03/16 Python
pandas取出重复数据的方法
2019/07/04 Python
django实现模板中的字符串文字和自动转义
2020/03/31 Python
python实现手势识别的示例(入门)
2020/04/15 Python
python3.4中清屏的处理方法
2020/07/06 Python
Python requests接口测试实现代码
2020/09/08 Python
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
意大利奢侈品零售商:ilDuomo Novara
2019/09/11 全球购物
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
应届毕业生求职信范文分享
2013/12/26 职场文书
银行招聘自荐信
2015/03/06 职场文书
财务稽核岗位职责
2015/04/13 职场文书
python随机打印成绩排名表
2021/06/23 Python
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记
MySQL数据库之内置函数和自定义函数 function
2022/06/16 MySQL