参数:图片宽高、验证码个数,文字大小
def check_code(width=90, height=30, length=4, font_size=26):
code = []
from PIL import Image, ImageDraw
img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
def rndChar():
# 定义字符的ASCII码范围
ascii_ranges = [
(48, 57), # 数字 0-9
(65, 90), # 大写字母 A-Z
(97, 122), # 小写字母 a-z
]
# 随机选择一个范围
chosen_range = random.choice(ascii_ranges)
# 在选定的范围内随机选择一个字符并返回
return chr(random.randint(chosen_range[0], chosen_range[1]))
def rndColor():
# 随机颜色,不用255因为有点浅
return (random.randint(0, 200), random.randint(0, 200), random.randint(0, 200))
# 绘制字符
for i in range(length):
char = rndChar()
code.append(char)
h = random.randint(0, 3)
w = i * width / length + random.randint(-2, 5)
draw.text(xy=(w, h), text=char, fill=rndColor(), font_size=font_size)
# 绘制黑色干扰像素点
for _ in range(40):
draw.point(xy=(random.randint(0, width), random.randint(0, height)), fill=(0,0,0))
# 绘制干扰圈
for _ in range(30):
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc(xy=(x, y, x + 5, y + 5), start=random.randint(0, 180), end=random.randint(180, 360), fill=rndColor())
# 绘制干扰线
for i in range(5):
x1, y1 = random.randint(0, width), random.randint(0, height)
x2, y2 = random.randint(0, width), random.randint(0, height)
draw.line(xy=(x1, y1, x2, y2), fill=rndColor())
img.save(r'./code.png')
return img, ''.join(code) # 返回图片Image对象和code
python生成随机验证码图片+噪声
于 2024-04-29 15:14:05 首次发布