python生成验证码图片代码分享
作者:lxydo 时间:2021-08-24 11:52:14
本文实例为大家分享了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') #保存验证码图片
下面是用上述程序生成的一个验证码
下面是完整的代码:
#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,验证码
0
投稿
猜你喜欢
python神经网络InceptionV3模型复现详解
2021-05-29 16:53:01
mysql容器之间的replication配置实例详解
2024-01-17 23:48:01
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2023-09-04 10:21:28
Python基于os.environ从windows获取环境变量
2022-09-18 01:42:45
golang 实现interface{}转其他类型操作
2024-05-09 09:31:23
关于Python的高级数据结构与算法
2023-12-22 00:29:40
Scrapy之迭代爬取网页中失效问题及解决
2022-11-02 21:03:32
Oracle数据库逻辑备份的SH文件
2010-07-27 13:26:00
教你怎么用PyCharm为同一服务器配置多个python解释器
2022-01-29 10:22:21
PHP/ThinkPHP实现批量打包下载文件的方法示例
2024-05-11 09:49:00
Python编程实现简单的微博自动点赞
2021-05-14 06:43:12
DIV+CSS高度自适应网页代码实例
2008-09-20 08:00:00
Ubuntu16.04安装python3.6.5步骤详解
2023-01-01 08:06:58
Selenium爬取b站主播头像并以昵称命名保存到本地
2023-05-18 01:26:36
PHP获取二叉树镜像的方法
2023-07-13 02:57:39
bootstrapValidator表单验证插件学习
2024-04-10 13:53:34
Python中集合的内建函数和内建方法学习教程
2023-11-03 04:11:27
Django 中的Timezone 处理操作
2022-01-08 10:23:20
MySQL单表查询常见操作实例总结
2024-01-20 05:47:17
mysql报错:MySQL server version for the right syntax to use near type=InnoDB的解决方法
2024-01-20 19:17:17