目录
验证码是一种常见的安全机制,用于防止恶意软件自动进行某些操作。本文将介绍如何使用Python和PIL库生成一个包含随机字符、干扰点、干扰圆圈和干扰线的验证码图片。
导入所需库
首先,我们需要导入一些必要的库:
import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
定义生成验证码的函数
接下来,我们定义一个名为check_code
的函数,该函数接受以下参数:
width
:图片宽度,默认为120像素。height
:图片高度,默认为30像素。char_length
:验证码字符长度,默认为5个字符。font_file
:字体文件路径,默认为'Monaco-1.ttf'。font_size
:字体大小,默认为28像素。
函数返回一个包含验证码图片和验证码文本的元组。
def check_code(width=120, height=30, char_length=5, font_file='Monaco-1.ttf', font_size=28):
code = []
img = Image.new('RGB', (width, height), (255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
生成随机字符和颜色
为了生成验证码中的字符,我们需要定义两个辅助函数:rndChar
和rndColor
。
def rndChar():
"""
生成随机字母
:return:
"""
return chr(random.randint(65, 90))
def rndColor():
"""
生成随机颜色
:return:
"""
return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))
绘制验证码字符
现在我们可以开始绘制验证码字符了。我们将使用ImageFont.truetype
创建一个字体对象,然后使用draw.text
方法在图片上绘制字符。
font = ImageFont.truetype(font_file, font_size)
for i in range(char_length):
char = rndChar()
code.append(char)
h = random.randint(0, 4)
draw.text((i * width / char_length, h), char, font=font, fill=rndColor())
添加干扰元素
为了增加验证码的难度,我们可以添加一些干扰元素,如干扰点、干扰圆圈和干扰线。
# 写干扰点
for i in range(40):
draw.point((random.randint(0, width), random.randint(0, height)), fill=rndColor())
# 写干扰圆圈
for i in range(40):
draw.point((random.randint(0, width), random.randint(0, height)), fill=rndColor())
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())
# 画干扰线
for i in range(5):
x1 = random.randint(0, width)
y1 = random.randint(0, height)
x2 = random.randint(0, width)
y2 = random.randint(0, height)
draw.line([(x1, y1), (x2, y2)], fill=rndColor())
应用滤镜并返回结果
最后,我们可以对图片应用一个滤镜以增强其视觉效果,并将验证码图片和文本一起返回。
img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
return img, ''.join(code)
至此,我们已经完成了一个简单的验证码生成器。你可以根据需要调整参数以获得不同的验证码样式。