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 相关文章推荐
Python中的列表知识点汇总
Apr 14 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 Python
Tornado高并发处理方法实例代码
Jan 15 Python
Python的argparse库使用详解
Oct 09 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
python使用paramiko实现ssh的功能详解
Mar 06 Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 02 Python
基于PyTorch中view的用法说明
Mar 03 Python
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
Apr 13 Python
给numpy.array增加维度的超简单方法
Jun 02 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
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
编写安全 PHP应用程序的七个习惯深入分析
2013/06/08 PHP
php短址转换实现方法
2015/02/25 PHP
PHP数组相关函数汇总
2015/03/24 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
Jquery练习之表单验证实现代码
2010/12/14 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
JavaScript模块详解
2017/12/18 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
Python中functools模块的常用函数解析
2016/06/30 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
现代化办公人员工作的自我评价
2013/10/16 职场文书
公司中层干部的自我评价分享
2014/03/01 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
烈士陵园观后感
2015/06/08 职场文书
导游词之临安白水涧
2019/11/05 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android