一、PIL库
PIL : Python图像库PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。
环境中下载:pip install pillow
图像验证码
1. 初始化: 字符长度,宽度,高度,字符大小;
2. 随机产生字符:26个大小写字母和10个数字为源;
3. 随机颜色:让字符的颜色随机;
4. 绘制干扰线和干扰点
5. 模糊滤镜
同样,将图像验证码文件放置在utils文件夹编写,需求时进行导入调用
import os import random import string from PIL import Image, ImageFont, ImageDraw, ImageFilter class ImageVerify: def __init__(self, x=140, y=40, length=4, size=28): """ 初始化 :param x: 图片宽度 :param y: 图片高度 :param length: 字符的个数 :param size: 字体大小 """ self.x = x self.y = y self.length = length self.size = size def random_str(self): """ 随机生成制定长度的字符串 数据源:26个字母和10个数字 :return: 生成的字符串 """ soucre = string.ascii_letters + string.digits # string模块生成字符串信息 return ''.join(random.sample(soucre, self.length)) def random_color(self, start=0, end=255): """ 随机生成颜色 :param start: 颜色范围最小值 :param end: 颜色范围最大值 :return: tuple(r, g, b) 0~255 """ res = [random.randint(start, end) for i in range(3)] # []得到数据列表,()得到生成器并非元组,所以生成列表后转成元组 return tuple(res) def random_lines(self, draw): """ 绘制干扰线 :param draw: draw对象 画笔 :return: """ for i in range(self.length): lines = [(random.randint(0, self.x), random.randint(0, self.y)) for i in range(2)] draw.line(lines, fill=self.random_color(64, 200)) def random_points(self, draw, rate): """ 绘制干扰点 :param draw: 画笔 :param rate: 频率 :return: """ for x in range(self.x): for y in range(self.y): if random.randint(1, 100) <= rate: draw.point((x, y), fill=self.random_color(64, 200)) def verify_code(self): """ 生成验证码图片 :return: 图片及正确答案 """ # 创建Image对象 创建画布 image = Image.new('RGB', (self.x, self.y), (255, 255, 255)) # 白色背景画布 # 创建font对象 字体 file = os.path.dirname(os.path.abspath(__file__)) font = ImageFont.truetype(f'{file}/cybb.ttf', self.size) # 创建draw对象 画笔,绘制图形,线,点 draw = ImageDraw.Draw(image) # 绘制干扰线与干扰点 self.random_lines(draw) self.random_points(draw, 15) # 随机生成字符答案,验证码值 code = self.random_str() # 用画笔将font类型的字体对应的进行字符内容和颜色的绘制 for i in range(self.length): draw.text((35*i+5, 3), code[i], font=font, fill=self.random_color(30, 128)) # 模糊滤镜 # image = image.filter(ImageFilter.BLUR) # 返回图形及验证码 return image, code if __name__ == '__main__': imgVerfiy = ImageVerify() img, code = imgVerfiy.verify_code() # with open('test.png', 'wb') as fp: # img.save(fp) # print(code)