PIL(Python Imaging Library)生成验证码

本文介绍了一种使用Python生成包含随机字符、干扰线及干扰点的验证码图片的方法。文章详细阐述了如何利用PIL库创建画布、绘制随机字符,并通过设置字体、颜色等参数使生成的验证码更具挑战性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先导入PIL

import PIL

创建画板

size=(800, 640)
mode="RGB"
bg_color=(230, 230, 230)
img = Image.new(mode, size, bg_color)

创建画笔

draw = ImageDraw.Draw(img)

生成随机4位验证码

def get_chars():
    letter_cases = "abcdefghjkmnpqrstuvwxy"  # 小写字母,去除可能干扰的i,l,o,z
    upper_cases = _letter_cases.upper()  # 大写字母
    numbers = ''.join(map(str, range(10)))  # 数字
    chars = ''.join((letter_cases, upper_cases, numbers))
    strs = ' %s ' % ' '.join(random.sample(chars, 4))
    return strs

绘制干扰线

def create_lines(draw, img, n_line=1):
    """
    @param draw: 画笔
    @param img: 画板
    @param n_line: 干扰线条数
    """
    size = img.size
    line_num = random.randint(n_line)  # 随机个干扰线条数
    for i in range(line_num):
        # 起始点
        begin = (random.randint(0, size[0]), random.randint(0, size[1]))
        # 结束点
        end = (random.randint(0, size[0]), random.randint(0, size[1]))
        draw.line([begin, end], fill=(0, 0, 0))

绘制干扰点

def create_points(draw, img, point_chance=95):
    """
    @param draw: 画笔
    @param img: 画板
    @param point_chance:干扰点出现的概率
    """
    width, height = img.size
    chance = min(100, max(0, int(point_chance)))  # 大小限制在[0, 100]
    for w in range(width):
        for h in range(height):
            tmp = random.randint(0, 100)
            if tmp >= chance:
                draw.point((w, h), fill=(0, 0, 0))

生成字体参数

def generate_font(font_type, font_size):
    """
    :param font_type: 待画字符串字体
    :param font_size: 待画字符串字大小
    """
    return ImageFont.truetype(font_type, font_size)

计算验证码的长宽

def calculate_strs_size(strs, font):
    """
    :param strs: 待画字符串
    :param font: 待画字符串样式,大小,颜色,字体等的集合
    """
    # size表示该字符的长宽。offset表示字符到边框的距离,字符到边界还有一段空白
    size, offset = font.font.getsize(strs)
    width = size[0]
    height = size[1]
    return width, height

绘制验证码

def create_strs(draw, strs, font, fg_color=(18, 18, 18), begin=(0, 0)):
    """
    @param draw: 画笔
    @param strs: 待画字符串
    @param font: 待画字符串字体和大小
    @param fg_color: 待画字符串颜色
    @param begin: 待画字符串的起始位置
    """
    draw.text(begin, strs, font=font, fill=fg_color)
    return 

保存图片

img.save(r'D:\xxx/test.jpeg', 'jpeg')

主函数

if __name__ == '__main__':
    # 创建画板
    size = (800, 640)
    mode = "RGB"
    bg_color = (230, 230, 230)
    img = Image.new(mode, size, bg_color)

    # 创建画笔
    draw = ImageDraw.Draw(img)

    # 生成随机4位验证码
    strs = get_chars()

    # 绘制干扰线
    create_lines(draw, img, 5)

    # 绘制干扰点
    create_points(draw, img)

    # 计算字符起始位置
    font_type = r'C:\Windows\Fonts\simhei.ttf'
    font_size = 200
    font = generate_font(font_type, font_size)
    width, height = calculate_strs_size(strs, font)

    begin = ((size[0] - width) / 2, (size[1] - height) / 2)  # 字符串居中

    # 绘制验证码
    create_strs(draw, strs, font, begin=begin)

    # 保存图片
    img.save(r'D:\xxx/test.jpeg', 'jpeg')

 效果图:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值