题目传送口: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.整合内容,合成随机验证码