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中的index()方法使用教程
May 18 Python
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
浅谈终端直接执行py文件,不需要python命令
Jan 23 Python
Python 闭包的使用方法
Sep 07 Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
Sep 04 Python
Python实现常见的回文字符串算法
Nov 14 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
Python基于类路径字符串获取静态属性
Mar 12 Python
keras 如何保存最佳的训练模型
May 25 Python
Python安装Bs4的多种方法
Nov 28 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 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
PHP 自定义错误处理函数trigger_error()
2013/03/26 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
node.js的事件机制
2017/02/08 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
2017/05/27 Javascript
浅谈js中的this问题
2017/08/31 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
JavaScript中的几种继承方法示例
2020/12/06 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
python3学生名片管理v2.0版
2018/11/29 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
悦木之源美国官网:Origins美国
2016/08/01 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
2014年度党员自我评议
2014/09/13 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
行政上诉状范文
2015/05/23 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript