Python 如何生成复杂验证码?

怎么用 python 生成可以粘连、旋转的验证码图片,谢谢
Python 如何生成复杂验证码?

12 回复

求大神


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

def generate_complex_captcha(width=200, height=80, length=6):
    """
    生成复杂验证码图片
    
    参数:
        width: 图片宽度
        height: 图片高度
        length: 验证码字符长度
    
    返回:
        (Image对象, 验证码字符串)
    """
    # 1. 创建画布
    image = Image.new('RGB', (width, height), (255, 255, 255))
    draw = ImageDraw.Draw(image)
    
    # 2. 生成随机字符(字母+数字)
    chars = string.ascii_letters + string.digits
    captcha_text = ''.join(random.choice(chars) for _ in range(length))
    
    # 3. 加载字体(需要系统中存在字体文件)
    try:
        font = ImageFont.truetype('arial.ttf', 40)
    except:
        font = ImageFont.load_default()
    
    # 4. 绘制字符(随机位置、随机颜色、随机旋转)
    for i, char in enumerate(captcha_text):
        # 随机颜色
        color = (random.randint(0, 150), random.randint(0, 150), random.randint(0, 150))
        
        # 计算字符位置(留出边距)
        x = 20 + i * (width - 40) // length + random.randint(-5, 5)
        y = random.randint(10, height - 50)
        
        # 创建字符图像
        char_image = Image.new('RGBA', (50, 50), (255, 255, 255, 0))
        char_draw = ImageDraw.Draw(char_image)
        char_draw.text((10, 5), char, font=font, fill=color)
        
        # 随机旋转
        rotated = char_image.rotate(random.randint(-30, 30), expand=1)
        
        # 粘贴到主图像
        image.paste(rotated, (x, y), rotated)
    
    # 5. 添加干扰线
    for _ 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=(random.randint(0, 200), random.randint(0, 200), random.randint(0, 200)),
                 width=2)
    
    # 6. 添加噪点
    for _ in range(500):
        x = random.randint(0, width - 1)
        y = random.randint(0, height - 1)
        draw.point((x, y), fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
    
    # 7. 应用模糊滤镜增加识别难度
    image = image.filter(ImageFilter.GaussianBlur(radius=0.5))
    
    return image, captcha_text

# 使用示例
if __name__ == "__main__":
    # 生成验证码
    captcha_image, captcha_code = generate_complex_captcha()
    
    # 保存图片
    captcha_image.save('captcha.png')
    
    # 显示验证码文本(实际应用中应该存储在session或返回给前端)
    print(f"生成的验证码: {captcha_code}")
    print("验证码图片已保存为 captcha.png")

这个代码做了几件事:1)用PIL创建画布;2)生成随机字符(大小写字母+数字);3)每个字符随机位置、颜色和旋转角度;4)添加干扰线和噪点;5)最后加一点模糊效果。实际用的时候你可能需要调整参数,比如字体文件路径、颜色范围这些。

如下所示的验证码,该怎么生成,谢谢



主要是黏连咋办

图像处理库啊

调整字符间距

找一年级的小学生写 26 个字母和 10 个数字,收集大概 100 份样本就行了,然后逐字分隔再排列组合,够用户吃一壶了。

兄弟,完全不一样,重点是想生成类似图片的样子

你看图片那个,黏连,但是基本上不会重叠

回到顶部