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 相关文章推荐
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
python3.4用函数操作mysql5.7数据库
Jun 23 Python
Python中Scrapy爬虫图片处理详解
Nov 29 Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
django解决订单并发问题【推荐】
Jul 31 Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 Python
python matplotlib库直方图绘制详解
Aug 10 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
PyTorch安装与基本使用详解
Aug 31 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
星际流派综述
2020/03/04 星际争霸
php获取远程图片体积大小的实例
2013/11/12 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
[48:24]完美世界DOTA2联赛循环赛LBZS vs Forest 第一场 10月30日
2020/10/31 DOTA
python将ansible配置转为json格式实例代码
2017/05/15 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
CSS3不透明度实例讲解
2016/04/26 HTML / CSS
微博营销计划书
2014/01/10 职场文书
2014年环保工作总结
2014/11/26 职场文书
高中信息技术教学反思
2016/02/16 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript