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编程中的文件操作攻略
Oct 16 Python
Python引用模块和查找模块路径
Mar 17 Python
Python绑定方法与非绑定方法详解
Aug 18 Python
windows 下python+numpy安装实用教程
Dec 23 Python
pytorch训练imagenet分类的方法
Jul 27 Python
Python流行ORM框架sqlalchemy安装与使用教程
Jun 04 Python
Python集中化管理平台Ansible介绍与YAML简介
Jun 12 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
python实现ip代理池功能示例
Jul 05 Python
python读取指定字节长度的文本方法
Aug 27 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
详解分布式系统中如何用python实现Paxos
May 18 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
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
JS中表单的使用小结
2014/01/11 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
koa socket即时通讯的示例代码
2018/09/07 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
python中日志logging模块的性能及多进程详解
2017/07/18 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
最热门的自我评价
2013/12/30 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
幼儿园小班评语
2014/04/18 职场文书
2014年班务工作总结
2014/12/02 职场文书
岳麓书院导游词
2015/02/03 职场文书
法律意见书范文
2015/06/04 职场文书
房屋质量投诉书
2015/07/02 职场文书
节约用水广告语60条
2019/11/14 职场文书
导游词之铁岭象牙山
2019/12/06 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL
MySQL慢查询优化解决问题
2022/03/17 MySQL
python 学习GCN图卷积神经网络
2022/05/11 Python
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js