一、pillow库
Pillow库:是一个功能强大的Python图像处理库,它提供了丰富的图像处理功能,使得用户能够方便地使用Python对图像进行各种操作。
二、图像验证码的分析
首先需要一个图像,图像上需要绘制验证码,还需要任意多的点和几条线来造成干扰即可。
三、实现
1、安装pillow库:pip install pillow
使用一个类来实现图像验证码的生成
2、构造方法__init__, 初始化图像的宽、高,验证码字符长度、以及字体的大小。
3、随机生成length长的字符串
4、随机生成颜色
5、随机生成线
6、随机生成点
7、生成验证码图像,调用上面编写好的方法
四、效果展示
五、代码
import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import string
class ImageVerify:
def __init__(self, length=4, width=100, height=50, size=18):
self.length = length # 验证码字符串的长度
self.width = width # 图片的宽
self.height = height # 图片的高
self.size = size # 字体的大小
# 随机生成字符串
def random_str(self):
# string.ascii_letters包含字母的大小写,值为abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
# source = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
source = string.ascii_letters + '0123456789'
# 随机从source中获取length个不重复的元素,然后拼接
return ''.join(random.sample(source, self.length))
# 随机生成颜色
def random_color(self, start=0, end=255):
# 元组推导式,(a, b, c), a, b, c默认范围为0~255, 就是RGB
res = (random.randint(start, end) for i in range(3))
return tuple(res)
# 随机生成线
def random_lines(self, draw):
# 在图片上随机位置上生成4条线
for i in range(self.length):
# 生成一个带有两个元组元素的列表,第一个元组表示线的开始坐标,第二个元组表示线的结束坐标
lines = [(random.randint(0, self.width), random.randint(0, self.height)) for i in range(2)]
# line方法用来绘制线条,参数一:线的起始位置和结束位置,参数2:颜色,参数3:线的宽度
draw.line(lines, fill=self.random_color(64, 255), width=2)
# 随机生成点
def random_points(self, draw, rate):
# 因为width为图形验证码的宽,height为图形验证码的高,整个图都是由点组成的
# 点的x坐标范围:[0, 图形的宽度], y的坐标范围:[0, 图形的高度], 这样就能遍历图像的每一个像素点
# rate 用来控制点生成的概率,大约100个点有rate个点被选中
# point方法用来画点,参数1:点的坐标, 参数2:点的颜色
for x in range(self.width):
for y in range(self.height):
if random.randint(1, 100) <= rate:
draw.point((x, y), fill=self.random_color(64, 255))
# 生成验证码图片
def image_code(self):
# 创建一个新图像 参数1:这个图像是RGB模式的,意味着它包含红色、绿色和蓝色三个颜色通道,
# 参数2:图像的宽高
# 参数3:图像的初始背景色
image = Image.new('RGB', (self.width, self.height), (255, 255, 255))
# ImageFont.truetype()加载字体函数,参数1:字体,去网上找一个字体即可,参数2:字体大小
font = ImageFont.truetype(f'SourceHanSans-Bold.otf', self.size)
# 画图
draw = ImageDraw.Draw(image)
# 在图上画线和点
self.random_lines(draw)
self.random_points(draw, 15)
# 生成验证码
code = self.random_str()
# text函数用来绘制文本
# 参数1:绘制文本的坐标
# 参数2:文本,这里将4位字符的验证码拆开绘制
# 参数3:字体
# 参数4:颜色
for i in range(self.length):
draw.text((29 * i, 14), code[i], font=font, fill=self.random_color(32, 127))
# 给图像滤镜
image = image.filter(ImageFilter.DETAIL)
# 保存图像到当前路径
image.save(f'{code}.jpg')
# 返回图像和验证码
return image, code
if __name__ == '__main__':
verify = ImageVerify()
image, text = verify.image_code()
print(image, text)