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

 更新时间:2025年01月20日 09:02:29   作者:_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)
 
 
 

总结

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

相关文章

  • python实现坦克大战游戏 附详细注释

    python实现坦克大战游戏 附详细注释

    这篇文章主要为大家详细介绍了python实现坦克大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Python subprocess模块功能与常见用法实例详解

    Python subprocess模块功能与常见用法实例详解

    这篇文章主要介绍了Python subprocess模块功能与常见用法,结合实例形式详细分析了subprocess模块功能、常用函数相关使用技巧,需要的朋友可以参考下
    2018-06-06
  • 深入剖析Python的列表和元组

    深入剖析Python的列表和元组

    这篇文章主要介绍了深入剖析Python的列表和元组,Python有4个内建的数据结构,它们可以统称为容器,因为它们实际上是一些“东西”组合而成的结构,而这些“东西”,可以是数字、字符甚至列表,或是它们的组合,需要的朋友可以参考下
    2023-07-07
  • python polars数据科学库对比Pandas优势分析

    python polars数据科学库对比Pandas优势分析

    这篇文章主要为大家介绍了python polars数据科学库对比Pandas优势分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python使用SciencePlots库绘制学术图表详解

    Python使用SciencePlots库绘制学术图表详解

    这篇文章主要介绍了Python使用SciencePlots库绘制学术图表,SciencePlots提供了一系列预设的科学绘图样式,能够帮助研究人员轻松创建专业的学术图表,需要的朋友可以参考下
    2025-04-04
  • Tensorflow 2.1完成对MPG回归预测详解

    Tensorflow 2.1完成对MPG回归预测详解

    这篇文章主要为大家介绍了Tensorflow 2.1完成对MPG回归预测详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Python 数据分析之Beautiful Soup 提取页面信息

    Python 数据分析之Beautiful Soup 提取页面信息

    Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序
    2021-10-10
  • Python中使用item()方法遍历字典的例子

    Python中使用item()方法遍历字典的例子

    这篇文章主要介绍了Python中使用item()方法遍历字典的例子,for...in这种是Python中最常用的遍历字典的方法了,需要的朋友可以参考下
    2014-08-08
  • python3 traceback模块来追踪和打印异常信息

    python3 traceback模块来追踪和打印异常信息

    本文主要介绍了python3 traceback模块来追踪和打印异常信息,这个模块提供了许多函数来处理异常,并且能够输出异常的堆栈信息,感兴趣的可以了解一下
    2024-02-02
  • Python 实现图像逐像素点取邻域数据

    Python 实现图像逐像素点取邻域数据

    这篇文章主要介绍了Python 实现图像逐像素点取邻域数据,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论