python本地生成验证码图片

from io import BytesIO
from PIL import Image, ImageDraw, ImageFont
from captcha.image import ImageCaptcha
import random, string

def get_captcha_picture():
    chr_all = string.ascii_uppercase + string.digits  # 只使用大写字母和数字,避免混淆
    chr_4 = ''.join(random.sample(chr_all, 4))

    # 使用PIL创建验证码图片(替代ImageCaptcha)
    width, height = 120, 40
    image = Image.new('RGB', (width, height), color=(240, 240, 240))
    draw = ImageDraw.Draw(image)

    try:
        # 尝试使用系统字体
        font = ImageFont.truetype("arial.ttf", size=24)
    except IOError:
        try:
            # 尝试其他常见字体
            font = ImageFont.truetype("DejaVuSans.ttf", size=24)
        except IOError:
            # 使用默认字体
            font = ImageFont.load_default()

    # 绘制验证码文本
    for i, char in enumerate(chr_4):
        x = 10 + i * 25 + random.randint(-3, 3)
        y = 5 + random.randint(-3, 3)
        draw.text((x, y), char, fill=(random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)),
                  font=font)

    # 添加干扰线
    for _ in range(3):
        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(150, 200), random.randint(150, 200), random.randint(150, 200)),
                  width=1)

    # 添加噪点
    for _ in range(50):
        x = random.randint(0, width - 1)
        y = random.randint(0, height - 1)
        draw.point((x, y), fill=(random.randint(150, 200), random.randint(150, 200), random.randint(150, 200)))

    # 将图片转换为二进制数据
    buffered = BytesIO()
    image.save(buffered, format="JPEG", quality=95)  # 明确指定质量和格式


    return image
posted @ 2025-10-09 17:05  vetra  阅读(12)  评论(0)    收藏  举报