python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python的pillow库生成图像验证码

如何使用python的pillow库生成图像验证码

作者:_BooI

Pillow库是一个强大的Python图像处理库,用于生成图像验证码,通过初始化图像大小、验证码字符长度和字体大小,生成随机字符串、颜色、线和点,最终生成验证码图像

一、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)
 
 
 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文