代码都是中文的简单易懂 依赖库少
# 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