python PIL图片验证码简单生成

python PIL图片验证码简单生成

代码都是中文的简单易懂 依赖库少

# coding:utf-8
from PIL import Image, ImageDraw, ImageFont
import string, random, base64
from io import BytesIO


def code_add(图片大小=(100, 38), 验证码个数=4, 图片类型='png'):
    try:
        背景颜色 = (30, 159, 225)  # 背景颜色的RGB值  可以自行定义
        空白图片对象 = Image.new('RGB', 图片大小, 背景颜色)  # 生成一张空白图片
        字体对象 = ImageFont.truetype('C:/Windows/Fonts/Dengl.ttf', int(图片大小[1] * (8 / 10)))  # 生成字体对象 如果字体文件位置错误请百度一下,我也不知道。。。
        画笔对象 = ImageDraw.Draw(空白图片对象)  # 生成画笔对象
        验证码实码 = ''.join(random.sample(string.digits, k=验证码个数))  # 生成随机字符也就是验证码文本    随机类型a-zA-Z所有字符中选取 string.ascii_letters  随机类型0-9所有数字中选取 string.digits
        字体总宽, 字体总高 = 字体对象.getsize(验证码实码)  # 获取字符串需要占用的总宽高
        单个文字宽度 = int(字体总宽 / 验证码个数)  # 得到单个文字的大概宽度
        字体线宽 = 1
        干扰点比例 = 5  # 5就是5%

        # 计算文字所在位置
        图片切分后宽度 = 图片大小[0] / 验证码个数
        单个文字两边间隙 = (图片切分后宽度 - 单个文字宽度) / 2
        文字分块起点列表 = []
        for i1 in range(验证码个数):
            图片分块起点 = 0 + (图片切分后宽度 * i1)
            文字分块起点 = 图片分块起点 + 单个文字两边间隙
            文字分块起点列表.append(文字分块起点)

        # 向空白图片添加文字
        for i2 in 文字分块起点列表:
            文字竖向位置 = (图片大小[1] - 字体总高) / 2
            文字横向位置 = i2
            文字位置 = 文字横向位置, 文字竖向位置
            文字所在列表位置 = 文字分块起点列表.index(i2)  # 文字列表和文字位置列表是一一对应的所以可以直接使用
            当前要写的文字 = 验证码实码[文字所在列表位置]
            画笔对象.text(文字位置, 当前要写的文字, stroke_width=字体线宽, font=字体对象, fill=(random.randint(0, 225), random.randint(0, 225), random.randint(0, 225)))

        # 按照概率随机绘制干扰小圆点
        for w in range(图片大小[0]):
            for h in range(图片大小[1]):
                tmp = random.randint(0, 100)
                if tmp < 干扰点比例:
                    画笔对象.point((w, h), fill=(random.randint(0, 225), random.randint(0, 225), random.randint(0, 225)))  # w是横向位置h是竖向位置 fill是圆点的RGB颜色

        # 生成base64
        临时的二进制对象 = BytesIO()
        空白图片对象.save(临时的二进制对象, format=图片类型)
        新的图片对象 = 临时的二进制对象.getvalue()
        base64字符串 = base64.b64encode(新的图片对象).decode('utf-8')

        # 其他
        # 空白图片对象.save('空白图片对象.png', format=图片类型)# 保存图片
        # 空白图片对象.show()#展示图片

        # 构建输出
        return {"图片明文": 验证码实码, "图片base": "data:image/jpg;base64," + base64字符串}

    except Exception as e:
        print(str(e))
        return False

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值