Python 语言 用 Pillow 生成动态验证码 随机字符 + 干扰线 + 扭曲 + 颜色渐变

Python阿木 发布于 2025-06-09 11 次阅读


Python Pillow 动态验证码生成技术详解

验证码是防止恶意用户通过自动化工具进行非法操作的一种常见手段。在Web应用中,动态验证码因其随机性和动态性,能够有效提高安全性。本文将使用Python的Pillow库来生成包含随机字符、干扰线、扭曲和颜色渐变的动态验证码。

准备工作

在开始编写代码之前,请确保已经安装了Python和Pillow库。可以使用以下命令安装Pillow库:

bash
pip install Pillow

验证码生成原理

动态验证码通常包含以下元素:

1. 随机字符:生成一系列随机字符作为验证码内容。
2. 干扰线:在验证码背景上添加干扰线,增加识别难度。
3. 扭曲:对验证码图像进行扭曲处理,进一步增加识别难度。
4. 颜色渐变:为验证码背景添加颜色渐变效果,使背景更加复杂。

代码实现

以下是一个使用Pillow库生成动态验证码的示例代码:

python
from PIL import Image, ImageDraw, ImageFont
import random
import string

def generate_captcha(width, height, characters=4):
创建白色背景图像
image = Image.new('RGB', (width, height), 'white')
draw = ImageDraw.Draw(image)

设置字体和颜色
font = ImageFont.truetype('arial.ttf', 40)
font_color = (0, 0, 0)

生成随机字符
captcha_text = ''.join(random.choices(string.ascii_uppercase + string.digits, k=characters))
draw.text((10, 10), captcha_text, font=font, fill=font_color)

添加干扰线
for _ in range(10):
draw.line((random.randint(0, width), random.randint(0, height),
random.randint(0, width), random.randint(0, height)), fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))

扭曲图像
image = image.rotate(random.uniform(-10, 10), expand=True)

添加颜色渐变
for y in range(height):
for x in range(width):
r = min(x, y, width - x, height - y)
color = (r, r, r)
image.putpixel((x, y), color)

return image, captcha_text

生成验证码
captcha_image, captcha_text = generate_captcha(200, 100)
captcha_image.show()
print("验证码文本:", captcha_text)

代码解析

1. 导入库:首先导入必要的库,包括Pillow库中的Image、ImageDraw和ImageFont模块,以及random和string模块。

2. 生成随机字符:使用`random.choices`函数从字母和数字中随机选择字符,生成验证码文本。

3. 创建背景图像:使用`Image.new`函数创建一个指定大小的白色背景图像。

4. 设置字体和颜色:使用`ImageFont.truetype`函数加载字体,并设置字体大小和颜色。

5. 绘制字符:使用`ImageDraw.Draw`对象在图像上绘制验证码文本。

6. 添加干扰线:使用`draw.line`函数在图像上随机绘制干扰线。

7. 扭曲图像:使用`image.rotate`函数对图像进行扭曲处理。

8. 添加颜色渐变:遍历图像的每个像素,根据像素位置计算颜色值,并使用`image.putpixel`函数设置像素颜色。

9. 返回图像和文本:将生成的图像和验证码文本返回。

总结

本文介绍了使用Python Pillow库生成动态验证码的方法。通过随机字符、干扰线、扭曲和颜色渐变等元素,提高了验证码的识别难度,从而增强了安全性。在实际应用中,可以根据需求调整验证码的样式和参数,以满足不同的安全需求。