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 相关文章推荐
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
Python补齐字符串长度的实例
Nov 15 Python
python 移动图片到另外一个文件夹的实例
Jan 10 Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 Python
运用Python的webbrowser实现定时打开特定网页
Feb 21 Python
Python matplotlib学习笔记之坐标轴范围
Jun 28 Python
Pytorch 中retain_graph的用法详解
Jan 07 Python
TensorFlow tensor的拼接实例
Jan 19 Python
在django admin详情表单显示中添加自定义控件的实现
Mar 11 Python
python列表的逆序遍历实现
Apr 20 Python
python 两种方法删除空文件夹
Sep 29 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中base_convert()进制数字转换函数实例
2014/11/20 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
JavaScript的9个陷阱及评点分析
2008/05/16 Javascript
基于jquery的网页SELECT下拉框美化代码
2010/10/28 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
jQuery中JSONP的两种实现方式详解
2016/09/26 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
python批量修改文件后缀示例代码分享
2013/12/24 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
python使用tcp实现局域网内文件传输
2020/03/20 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
python如何实现代码检查
2019/06/28 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
python默认参数调用方法解析
2020/02/09 Python
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
网页设计个人找工作求职信
2013/11/28 职场文书
年度考核自我鉴定
2014/03/19 职场文书
推广普通话标语
2014/06/27 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
色戒观后感
2015/06/12 职场文书
工资证明范本
2015/06/12 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python