Python 如何生成复杂验证码?
怎么用 python 生成可以粘连、旋转的验证码图片,谢谢
Python 如何生成复杂验证码?
12 回复
求大神
import random
import string
from PIL import Image, ImageDraw, ImageFont, ImageFilter
def generate_complex_captcha(width=200, height=80, length=6):
"""
生成复杂验证码图片
参数:
width: 图片宽度
height: 图片高度
length: 验证码字符长度
返回:
(Image对象, 验证码字符串)
"""
# 1. 创建画布
image = Image.new('RGB', (width, height), (255, 255, 255))
draw = ImageDraw.Draw(image)
# 2. 生成随机字符(字母+数字)
chars = string.ascii_letters + string.digits
captcha_text = ''.join(random.choice(chars) for _ in range(length))
# 3. 加载字体(需要系统中存在字体文件)
try:
font = ImageFont.truetype('arial.ttf', 40)
except:
font = ImageFont.load_default()
# 4. 绘制字符(随机位置、随机颜色、随机旋转)
for i, char in enumerate(captcha_text):
# 随机颜色
color = (random.randint(0, 150), random.randint(0, 150), random.randint(0, 150))
# 计算字符位置(留出边距)
x = 20 + i * (width - 40) // length + random.randint(-5, 5)
y = random.randint(10, height - 50)
# 创建字符图像
char_image = Image.new('RGBA', (50, 50), (255, 255, 255, 0))
char_draw = ImageDraw.Draw(char_image)
char_draw.text((10, 5), char, font=font, fill=color)
# 随机旋转
rotated = char_image.rotate(random.randint(-30, 30), expand=1)
# 粘贴到主图像
image.paste(rotated, (x, y), rotated)
# 5. 添加干扰线
for _ in range(5):
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(0, 200), random.randint(0, 200), random.randint(0, 200)),
width=2)
# 6. 添加噪点
for _ in range(500):
x = random.randint(0, width - 1)
y = random.randint(0, height - 1)
draw.point((x, y), fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
# 7. 应用模糊滤镜增加识别难度
image = image.filter(ImageFilter.GaussianBlur(radius=0.5))
return image, captcha_text
# 使用示例
if __name__ == "__main__":
# 生成验证码
captcha_image, captcha_code = generate_complex_captcha()
# 保存图片
captcha_image.save('captcha.png')
# 显示验证码文本(实际应用中应该存储在session或返回给前端)
print(f"生成的验证码: {captcha_code}")
print("验证码图片已保存为 captcha.png")
这个代码做了几件事:1)用PIL创建画布;2)生成随机字符(大小写字母+数字);3)每个字符随机位置、颜色和旋转角度;4)添加干扰线和噪点;5)最后加一点模糊效果。实际用的时候你可能需要调整参数,比如字体文件路径、颜色范围这些。
如下所示的验证码,该怎么生成,谢谢

主要是黏连咋办
图像处理库啊
调整字符间距
找一年级的小学生写 26 个字母和 10 个数字,收集大概 100 份样本就行了,然后逐字分隔再排列组合,够用户吃一壶了。
666
https://github.com/Ctrlsman/utils/blob/master/my_check_code.py
兄弟啊,拿去用把,记得给个 star 啊
兄弟,完全不一样,重点是想生成类似图片的样子
你看图片那个,黏连,但是基本上不会重叠

