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 相关文章推荐
有关wxpython pyqt内存占用问题分析
Jun 09 Python
Python中os.path用法分析
Jan 15 Python
Python基于Tkinter实现的记事本实例
Jun 17 Python
python实现二叉查找树实例代码
Feb 08 Python
python3 图片referer防盗链的实现方法
Mar 12 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
纯python进行矩阵的相乘运算的方法示例
Jul 17 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
Django中使用Celery的方法步骤
Dec 07 Python
利用Pycharm连接服务器的全过程记录
Jul 01 Python
Python初识逻辑与if语句及用法大全
Aug 07 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
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
php笔记之:AOP的应用
2013/04/24 PHP
php去除数组中重复数据
2014/11/18 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
JavaScript splice()方法详解
2020/09/22 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
初识Javascript小结
2015/07/16 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
OPENCV去除小连通区域,去除孔洞的实例讲解
2018/06/21 Python
python导入模块交叉引用的方法
2019/01/19 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
美国购车网站:TrueCar
2016/10/19 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
远程教育心得体会
2014/01/03 职场文书
会计大学生职业生涯规划书范文
2014/01/13 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
甜品店创业计划书
2014/08/14 职场文书
优秀团员事迹材料1000字
2014/08/20 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
大学四年个人总结
2015/03/03 职场文书
python实现图片批量压缩
2021/04/24 Python
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers