最近领导想要在登录界面上增加验证码功能,我就想着自己画一个,在网上搜罗一会儿,找到了一个不错的。
直接运行下面的函数就可以得到验证码了,效果如下:
代码:
1 from PIL import Image, ImageDraw, ImageFont, ImageFilter 2 import random 3 4 5 def check_code(width=120, height=30, char_length=5, font_file=‘kumo.ttf‘, font_size=28): 6 code = [] 7 img = Image.new(mode=‘RGB‘, size=(width, height), color=(255, 255, 255)) 8 draw = ImageDraw.Draw(img, mode=‘RGB‘) 9 10 def random_char(): 11 """ 12 生成随机字母 13 :return: 14 """ 15 return chr(random.randint(65, 90)) 16 17 def random_color(): 18 """ 19 生成随机颜色 20 :return: 21 """ 22 return random.randint(0, 255), random.randint(10, 255), random.randint(64, 255) 23 24 # 写文字 25 font = ImageFont.truetype(font_file, font_size) 26 for i in range(char_length): 27 char = random_char() 28 code.append(char) 29 h = random.randint(0, 4) 30 draw.text([i * width / char_length, h], char, font=font, fill=random_color()) 31 32 # 写干扰点 33 for i in range(40): 34 draw.point([random.randint(0, width), random.randint(0, height)], fill=random_color()) 35 36 # 写干扰圆圈 37 for i in range(40): 38 draw.point([random.randint(0, width), random.randint(0, height)], fill=random_color()) 39 x = random.randint(0, width) 40 y = random.randint(0, height) 41 draw.arc((x, y, x + 4, y + 4), 0, 90, fill=random_color()) 42 43 # 画干扰线 44 for i in range(5): 45 x1 = random.randint(0, width) 46 y1 = random.randint(0, height) 47 x2 = random.randint(0, width) 48 y2 = random.randint(0, height) 49 50 draw.line((x1, y1, x2, y2), fill=random_color()) 51 52 img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) 53 return img,‘‘.join(code) 54 55 56 if __name__ == ‘__main__‘: 57 # 1. 直接打开 58 img, code = check_code() 59 img.show() 60 print(code)
最后:
生成的是一个图片和一个正确的字符串码,具体你怎么使用,看自己的想象力了,可以放在服务端验证,可以在cookie、session中等等等。
原文:https://www.cnblogs.com/lvpzs/p/13090058.html