目录
前言
验证码时网站为了防止恶意注册、发帖等而设置的验证手段。本文利用python中PIL库来将随机字符串写入图片,并增加干扰线、扭曲等效果,依次来实现验证码的制作。
一、验证码的作用
验证码时网站为了防止恶意注册、发帖等而设置的验证手段。其生成原理是将一串随机产生的数字或符号生成一幅图片,图片上加一些干扰像素(防止OCR)。下面介绍生成验证码的步骤。
二、使用步骤
1.安装PIL
通常,除了配置好python的环境外,还需要安装PIL库(专门用来处理图片的库)。PIL是Python语言的第三方库,PIL库支持图像的存储、显示和处理,能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条和文字等操作。
PIL库主要实现图像归档和图像处理两方面的功能需求。
- 图像归档:对图像进行批处理、生成图像预览、转换图像格式等。
- 图像处理:图像的基本处理、像素处理、颜色处理等。
安装PIL库的方法如下,需要安装的库的名字是pillow。安装指令如下:
pip install pillow
2.生成随机字符串
如果要生成验证码图片,首先需要生成一个随机字符串,包含26个字母和10个数字。
代码如下(示例):
#随机生成一个字符串
def gene_text():
#source=list(string.letters)
#source={'a','b','c','d','e','f','g','h','i','j','k','l','m',
# 'n','o','p','q','r','s','t','u','v','w','x','y','z'}
source=list(string.ascii_letters)
for index in range(0,10):
source.append(str(index))
return ''.join(random.sample(source, number)) #number生成验证码的位数
3.生成验证码图片
生成验证码图片就是将上一步随机生成的字符串写入到图片中,需要注意的是这里面的字体不是系统而定的,如果没有找到系统字体路径,也可以不设置,接下来要在图片上画几条干扰线。最后创建扭曲,加上滤镜,用来增强验证码的效果。代码如下(示例):
# -*- coding: utf-8 -*-
import random,string,sys,math
from PIL import Image,ImageDraw,ImageFont,ImageFilter
font_path="C:\Windows\Fonts\simfang.ttf"#字体路径
number=4 #生成验证码的位数
size=(80,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)
#source={'a','b','c','d','e','f','g','h','i','j','k','l','m',
# 'n','o','p','q','r','s','t','u','v','w','x','y','z'}
source=list(string.ascii_letters)
for index in range(0,10):
source.append(str(index))
return ''.join(random.sample(source, number)) #number生成验证码的位数
#用来绘制干扰线
def gene_line(draw,width,height):
for i in range(random.randint(line_number[0],line_number[1])):
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)
_,_,font_width,font_height=font.getbbox(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+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的PIL库来生成验证码。