Python每日练习之随机验证码

题目传送口:https://github.com/Yixiaohan/show-me-the-code

第 0010 题: 使用 Python 生成类似于下图中的字母验证码图片

 

思路:使用PIL来生成背景,文字,干扰线。通过ImageFilter来对图像进行平滑、锐化、边界增强等滤波处理。

代码如下:

 1 from PIL import Image, ImageDraw, ImageFilter, ImageFont
 2 import random
 3 
 4 def randomChar():                                 # 随机生成大小写字母
 5     if random.randint(0 , 2) == 0:
 6         return(chr(random.randint(65,90)))
 7     elif random.randint(0 , 2) == 1:
 8         return(chr(random.randint(97,122)))
 9     else:
10         return(chr(random.randint(48,57)))
11 
12 
13 def BGcolor():                                    # 随机生成背景色
14     return(random.randint(135,255),random.randint(135,255), random.randint(135,255))
15 
16 def Wordcolor():                                  # 随机生成字体颜色
17     return(random.randint(32,127), random.randint(32,127), random.randint(32,127))
18 
19 def CAPTCHA():                                    # 生成随机验证码
20     im = Image.new("RGB", (400,100),(255,255,255))
21     font = ImageFont.truetype('C:/Windows/Fonts/Inkfree.ttf',50)
22     draw = ImageDraw.Draw(im)
23     for x in range(400):
24         for y in range(100):
25             draw.point((x, y), BGcolor())
26         words = ""
27     for i in range(3):
28         fillcolor="RGB(%s , %s , %s)" % (random.randint(32,127) ,random.randint(32,127) , random.randint(32,127))
29         draw.line((35,random.randint(0,130),random.randint(130,150),random.randint(20,130)),fill=fillcolor,width=random.randint(1,5))
30         draw.line((random.randint(20,130),random.randint(255,275),random.randint(130,300),10),fill=fillcolor,width=random.randint(1,5))
31     for i in range(4):
32         word = randomChar()
33         draw.text((100 * i + random.randint(10,40),random.randint(0,20)),word,font = font, fill=Wordcolor())
34         words += word
35 
36     img = im.filter(ImageFilter.BLUR)
37     im.save("photo/CAPTCHA.png")
38     print(words)
39 
40 if __name__ == "__main__":
41     CAPTCHA()

  1.生成背景,文字,文字颜色

  2.添加随机干扰线

  3.整合内容,合成随机验证码

猜你喜欢

转载自www.cnblogs.com/one-two-one/p/12204308.html