参考链接:https://www.jianshu.com/p/9e44acf19513
最终结果:
定义一个类:
1.通过随机数,利用ASCII码来获取到相对应的字符。
def random_char(self): num = random.randint(1, 3) if num == 1: # 随机一个0-9之间数字: ascii码 char = random.randint(48, 57) elif num == 2: # 随机一个a-z之间字母 char = random.randint(97, 122) else: # 随机一个A-Z之间字母 char = random.randint(65, 90) return chr(char)
2.通过图片中的效果,可以看出有一些干扰字符, 比如_ , -等一些字符。
def random_diss(self): arr = ["^", "_", "-", ".", "~"] return arr[random.randint(0, len(arr) - 1)]
3.纵观图片颜色,小黑点是一种颜色区间,字体颜色和干扰字符是另一种颜色。
# 定义干扰字符颜色,干扰字符与字符颜色在不同区间 def random_char_color(self): return (random.randint(65, 255), random.randint(65, 255), random.randint(65, 255)) # 定义字符颜色, 三原色 RGB def random_diss_color(self): return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))
定义一个函数,来生成验证码
# 生成验证码: def create_captcha(self): width = 240 # 240px height = 60 # 60px # 创建一个图片 new(mode, size, color=0): image = Image.new("RGB", (width, height), (192, 192, 192)) # 创建font对象,定义字体和大小 # font_name = random.randint(1, 3) # font_file = os.path.join( # os.path.dirname(__file__), # "static/fonts") + "/%d.ttf" % font_name # font = ImageFont.truetype(font_file, 40) # 在window中运行,由于字体是存放在C:\Windows\Fonts下面 font = ImageFont.truetype(r'C:\Windows\Fonts\Arial.ttf', 40) # 创建draw画布使图片可编辑,填充像素点 draw = ImageDraw.Draw(image) for x in range(0, width, 5): for y in range(0, height, 5): draw.point((x, y), fill=self.random_diss_color()) # 填充干扰字符 for v in range(0, width, 30): dis = self.random_diss() w = 5 + v # 距离图片上边距最多15个像素, 最低五个像素 h = random.randint(5, 15) draw.text((w, h), dis, font=font, fill=self.random_diss_color()) # 填充字符 chars = "" for v in range(4): c = self.random_char() chars += str(c) # 距离图片上边距最多15个像素, 最低五个像素 h = random.randint(5, 15) # 占图片宽度1/4, 10px间距, 顺序平移 w = width / 4 * v + 10 draw.text((w, h), c, font=font, fill=self.random_char_color()) # 模糊效果: image.filter(ImageFilter.BLUR) # uuid4()——基于随机数: 由伪随机数得到,有一定的重复概率,该概率可以计算出来。 # unid.hex 表示以32个字符表示的UUID image_name = "%s.jpg" % uuid.uuid4().hex save_dir = os.path.join( os.path.dirname(__file__), "static/captcha") # 当路径不存在时自动创建 if not os.path.exists(save_dir): os.makedirs(save_dir) image.save(save_dir + '/' + image_name, "jpeg") return dict( image_name=image_name, captcha=chars ) image.show()