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 22 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
Python用threading实现多线程详解
Feb 03 Python
对python3中pathlib库的Path类的使用详解
Oct 14 Python
Django中更改默认数据库为mysql的方法示例
Dec 05 Python
python网络应用开发知识点浅析
May 28 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
python计算n的阶乘的方法代码
Oct 25 Python
numpy矩阵数值太多不能全部显示的解决
May 14 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
Sep 20 Python
python try...finally...的实现方法
Nov 25 Python
Python数据模型与Python对象模型的相关总结
Jan 26 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屏蔽关键字实现方法
2016/11/17 PHP
php获取数据库结果集方法(推荐)
2017/06/01 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
javascript时间差插件分享
2016/07/18 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
javascript编写简易计算器
2017/05/06 Javascript
深入理解vue-router之keep-alive
2017/08/31 Javascript
shiro授权的实现原理
2017/09/21 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
Python中为什么要用self探讨
2015/04/14 Python
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
python操作redis方法总结
2018/06/06 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
python中的对数log函数表示及用法
2020/12/09 Python
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
某科技软件测试面试题
2013/05/19 面试题
潘婷洗发水广告词
2014/03/14 职场文书
档案信息化建设方案
2014/05/16 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
工作简报格式范文
2015/07/21 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js