from uuid import uuid1from PIL import Image, ImageDraw, ImageFont, ImageFilterimport randomdef rnd_char(): ”””随机生成一个字符:数字 / 小写字母 / 大写字母””” i = random.randint(1, 3) if i == 1:# 小写字母 ASCII 97 ~ 122 an = random.randint(97, 122) elif i == 2:# 大写字母 ASCII 65 ~ 90 an = random.randint(65, 90) else:# 数字 ASCII 48 ~ 57 an = random.randint(48, 57) return chr(an)def rnd_dis(): ”””随机干扰字符(和验证码共用一套规则)””” return rnd_char()def rnd_color(): ”””噪点颜色:偏亮色系 (64~255),和背景区分””” return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))def rnd_color2(): ”””验证码文字颜色:深色 (32~127),保证辨识度””” return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))def create_code():# 设置图片尺寸:宽240,高60 width = 60 * 4 height = 60# 创建画布,RGB模式,浅灰色背景 image = Image.new('RGB', (width, height), (192, 192, 192))# 加载字体(注意替换为你本机可用字体路径!) font = ImageFont.truetype('./font/CorporateS-RegularItalic.otf', 36)# 创建画笔对象 draw = ImageDraw.Draw(image)# 1. 批量绘制噪点像素,降低OCR识别率 for x in range(0, width, 20): for y in range(0, height, 10): draw.point((x, y), fill=rnd_color())# 2. 生成4位验证码字符串 code_str = ”” for t in range(4): c = rnd_char() code_str += c# 纵向随机偏移,避免文字水平对齐 h = random.randint(1, height - 30)# 横向均分位置,预留边距 w = width / 4 * t + 10 draw.text((w, h), c, font=font, fill=rnd_color2())# 3. 添加干扰字符 for j in range(0, width, 30): dis_char = rnd_dis() w = random.randint(0, width) h = random.randint(1, height - 30) draw.text((w, h), dis_char, font=font, fill=rnd_color())# 4. 高斯模糊滤镜 image = image.filter(ImageFilter.BLUR)# uuid生成唯一图片名称,防止文件覆盖 code_name = f'{uuid1()}.jpg' save_dir = f'./{code_name}' image.save(save_dir, 'jpeg') print(f”验证码文本:{code_str},图片已保存 {save_dir}”) return code_str, imageif __name__ == '__main__': create_code()