如何使用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实现文字pdf转换图片pdf效果

    Python实现文字pdf转换图片pdf效果

    当我们把word转化为pdf,wps默认转化为文字pdf,而图片pdf要会员。所以本文将通过Python语言实现文字pdf转换图片pdf,需要的可以参考一下
    2022-04-04
  • python实现批量改文件名称的方法

    python实现批量改文件名称的方法

    这篇文章主要介绍了python实现批量改文件名称的方法,涉及Python中os模块rename方法的相关使用技巧,需要的朋友可以参考下
    2015-05-05
  • Python 生成VOC格式的标签实例

    Python 生成VOC格式的标签实例

    这篇文章主要介绍了Python 生成VOC格式的标签实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • python利用pymysql和openpyxl实现操作MySQL数据库并插入数据

    python利用pymysql和openpyxl实现操作MySQL数据库并插入数据

    这篇文章主要为大家详细介绍了如何使用Python连接MySQL数据库,并从Excel文件中读取数据,将其插入到MySQL数据库中,有需要的小伙伴可以参考一下
    2023-10-10
  • 速记Python布尔值

    速记Python布尔值

    这篇文章主要介绍了速记Python布尔值,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Python中协程间通信的方式小结

    Python中协程间通信的方式小结

    Python中协程间的通信方式包括asyncio.Queue、asyncio.Event、asyncio.Condition、asyncio.Semaphore、asyncio.Streams和asyncio.Future,感兴趣的可以了解一下
    2025-01-01
  • 使用Python实现文本情感分析预处理的详细教程

    使用Python实现文本情感分析预处理的详细教程

    在自然语言处理(NLP)领域,文本情感分析是一项重要任务,它旨在通过计算机技术识别和提取文本中的情感倾向(如正面、负面或中性),为了实现准确的情感分析,预处理步骤至关重要,所以本文给大家介绍了使用Python实现文本情感分析预处理的详细教程,需要的朋友可以参考下
    2025-04-04
  • 使用Selenium控制当前已经打开的chrome浏览器窗口

    使用Selenium控制当前已经打开的chrome浏览器窗口

    有时通过selenium打开网站时,发现有些网站需要扫码登录,就很头疼,导致爬虫进展不下去,下面这篇文章主要给大家介绍了关于使用Selenium控制当前已经打开的chrome浏览器窗口的相关资料,需要的朋友可以参考下
    2022-07-07
  • python 猴子补丁(monkey patch)

    python 猴子补丁(monkey patch)

    这篇文章主要介绍了python 猴子补丁(monkey patch),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • python pandas轻松通过特定列的值多条件去筛选数据及contains方法的使用

    python pandas轻松通过特定列的值多条件去筛选数据及contains方法的使用

    这篇文章主要介绍了python pandas轻松通过特定列的值多条件去筛选数据及contains方法的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02

最新评论