Python使用Pillow库生成随机验证码图片的完整指南

认真发呆
认真发呆
发布时间:2026-10-14| 5人浏览过
原创

本文详细介绍如何利用Python的Pillow(PIL)库生成随机验证码图片。内容涵盖使用random库生成随机颜色与字符,通过Image、ImageDraw和ImageFont模块绘制画布与文字,并对代码进行封装优化,支持大小写字母混合及字体调整,最终实现可复用的验证码生成函数。

前言与背景

前言

Pillow库功能丰富,本文旨在演示如何使用该库生成随机验证码图片。

关于Pillow的具体用法,可参考:https://www.jb51.net/article/196007.htm

验证码具有随机性,我们将利用Python内置的random库来生成随机颜色及随机字符。

random模块的使用说明可参考:https://www.jb51.net/article/196955.htm

验证码效果展示

一、验证码图片的效果展示


# coding=utf-8
import random
from PIL import Image, ImageDraw, ImageFont
 
 
width, height, font_size, font_num = 300, 100, 48, 5
bg_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
image = Image.new(mode='RGB', size=(width, height), color=bg_color)
draw = ImageDraw.Draw(image, mode='RGB')
font = ImageFont.truetype("C:\Windows\Fonts\Arial.ttf", font_size)
verify = str()
for i in range(font_num):
 x = random.randint(i*(width/font_num), (i+1)*(width/font_num)-font_size)
 y = random.randint(0, height-font_size)
 char = random.choice([chr(alpha) for alpha in range(65, 91)] + [str(num) for num in range(10)])
 verify += char
 color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
 draw.text((x, y), char, fill=color, font=font)
print(verify)
image.show()

运行上述代码后的结果如下:

KG7CQ

核心方法解析

二、核心方法解析

上述代码已实现随机验证码的生成,以下将详细解析代码中涉及的关键函数与方法。

Image.new():这是Image模块中的构造函数,用于创建一张图片(即画布)。它接收三个参数:画布模式('RGB'代表真彩色图片)、图像尺寸以及背景颜色。这里的背景颜色即为验证码图片的背景色。

ImageDraw.Draw():这是ImageDraw模块中的函数,用于实例化一个ImageDraw类的对象draw,从而执行绘图操作。该函数接收两个参数:画布对象和绘图模式。画布使用前面Image.new()创建的实例,模式继续指定为'RGB'真彩模式。Draw()函数将这两个参数传递给ImageDraw类,实例化一个类对象并返回,以便后续通过该draw对象调用相应方法执行绘图,例如将验证码字符绘制到画布上。

ImageFont.truetype():这是ImageFont模块中的函数,用于从字体文件或字体对象中读取字体信息并返回一个字体对象。它接收两个参数:字体文件路径(或字体对象)以及字体大小。注意,必须使用当前操作系统支持的字体。在Windows系统中,已安装的字体通常存储在C:\Windows\Fonts文件夹中,例如代码中使用的C:\Windows\Fonts\Arial.ttf,该字体通常默认安装。在代码中必须包含扩展名'.ttf',否则无法正确读取字体文件。若字体不在Windows\Fonts目录下,可通过控制面板查找或直接在全盘搜索Fonts文件夹。字体大小直接传入一个数值即可。

random模块中的randint()和choice()函数。在上述代码中,randint()用于随机生成颜色值,以及字符在画布上的x和y坐标。choice()则用于从26个大写字母(ASCII码65~90对应26个大写字母)和数字中随机选择一个字符。

text():这是ImageDraw模块中ImageDraw类的方法,通过ImageDraw.Draw()返回的类对象draw来调用,用于将字符绘制到画布上。text()方法共有12个参数,且可接收其他可变参数和关键字参数,但仅有两个必传参数。上述代码中仅传递了4个参数,因此其他参数不再赘述。第一个必传参数是xy,传入一个元组或列表,表示字符在画布上的位置坐标(以字符左上角为基准);第二个必传参数是text,传入一个字符串,表示需要绘制的字符。此外,代码中还传递了两个可选参数:fill表示字符颜色,传入随机生成的颜色值;font表示字符字体,传入由ImageFont.truetype()函数返回的字体对象。

通过循环将每次随机生成的字符绘制到画布上,最后使用image对象的show()方法显示图片,即可成功生成随机验证码图片。

代码优化与封装

三、代码优化与封装


import random
from PIL import Image, ImageDraw, ImageFont
 
 
def gen_verified_image():
 width, height, font_size, font_num = 400, 150, 48, 4
 bg_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
 image = Image.new(mode='RGB', size=(width, height), color=bg_color)
 draw = ImageDraw.Draw(image, mode='RGB')
 font = ImageFont.truetype("C:\Windows\Fonts\Gadugi.ttf", font_size)
 verify = str()
 for i in range(font_num):
  x = random.randint(i * (width / font_num) + 10, (i + 1) * (width / font_num) - font_size - 10)
  y = random.randint(20, height - font_size - 20)
  char = random.choice([chr(a) for a in range(65, 91)] + [chr(b) for b in range(97, 123)] +
        [str(num) for num in range(10)])
  verify += char
  color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
  draw.text((x, y), char, fill=color, font=font)
 return image, verify
 
 
if __name__ == '__main__':
 image, verify = gen_verified_image()
 print(verify)
 image.show()

优化后的运行结果如下:

qtC7

验证码使用的字体通常不易辨认,因此可以更换为更复杂的字体。除了大写字母外,还可以加入小写字母。同时,调整字符位置以避免绘制到画布边缘。将代码封装为一个函数,并将image对象和验证码字符串verify作为返回值,以便在调用时展示图片并进行验证。

总结

总结

至此,关于利用Python Pillow(PIL)库实现验证码图片生成的介绍已完成。如需了解更多Python使用Pillow(PIL)库生成验证码的相关内容,请搜索本站历史文章或继续浏览后续相关文章。感谢大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。