Python使用PIL库生成图形验证码的实现详解

Aria
Aria
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍如何利用Python的PIL图像处理库生成图形验证码。通过随机生成RGB颜色、数字及大小写字符,结合随机线条与噪点作为干扰元素,构建一张包含5个字符的验证码图片。文中详细讲解了字体处理、坐标定位及Django后端集成方法,适合新手练习图像处理与Web安全功能开发。

在常规网站访问过程中,用户经常需要面对图形验证码的验证环节。本文旨在通过自行开发图形验证码功能,为初学者提供一个简单且实用的练习案例,从而深入理解相关技术原理。

实现该功能主要依赖PIL图像处理库。核心逻辑在于组合多种随机元素:包括随机生成的颜色、随机选取的数字或字母,以及用于增加识别难度的随机线条和噪点,最终拼接成一张完整的验证码图片。

首先实现随机颜色的生成逻辑,该函数返回包含红、绿、蓝三个分量的RGB元组,用于后续绘制文字或背景。

def getRandomColor():
  r = random.randint(0, 255)
  g = random.randint(0, 255)
  b = random.randint(0, 255)
  return (r, g, b)

接着实现随机字符的生成逻辑,从0-9的数字、小写字母(a-z)及大写字母(A-Z)中随机选取一个字符作为验证码内容。

def getRandomChar():
  random_num = str(random.randint(0, 9))
  random_lower = chr(random.randint(97, 122)) # 小写字母a~z
  random_upper = chr(random.randint(65, 90)) # 大写字母A~Z
  random_char = random.choice([random_num, random_lower, random_upper])
  return random_char

在图片创建环节,首先设定图片宽高并生成随机背景色。随后利用ImageDraw对象在图片上绘制字符。由于系统默认字体较小,需加载特定字体文件(如Windows下的)并设置字号为。代码中循环生成5个随机字符,并为每个字符分配随机颜色,同时确保文字颜色与背景色不重合。最后将生成的图片保存至当前目录。

# 图片宽高
width = 160
height = 50

def createImg():
  bg_color = getRandomColor()
  # 创建一张随机背景色的图片
  img = Image.new(mode="RGB", size=(width, height), color=bg_color)
  # 获取图片画笔,用于描绘字
  draw = ImageDraw.Draw(img)
  # 修改字体
  font = ImageFont.truetype(font="arial.ttf", size=36)
  for i in range(5):
    # 随机生成5种字符+5种颜色
    random_txt = getRandomChar()
    txt_color = getRandomColor()
    # 避免文字颜色和背景色一致重合
    while txt_color == bg_color:
      txt_color = getRandomColor()
    # 根据坐标填充文字
    draw.text((10 + 30 * i, 3), text=random_txt, fill=txt_color, font=font)
  # 打开图片操作,并保存在当前文件夹下
  with open("test.png", "wb") as f:
    img.save(f, format="png")

执行上述代码后,可在项目文件夹中查看生成的初始验证码图片。

此时生成的图片较为清晰,缺乏干扰信息。为了提升验证码的安全性,需要在图中添加线条和噪点作为干扰元素,以模拟真实场景。

实现随机画线功能:在设定的图片宽高范围内,随机生成两个坐标点,并使用随机颜色连接这两点绘制线条,循环执行5次以生成多条干扰线。

def drawLine(draw):
  for i in range(5):
    x1 = random.randint(0, width)
    x2 = random.randint(0, width)
    y1 = random.randint(0, height)
    y2 = random.randint(0, height)
    draw.line((x1, y1, x2, y2), fill=getRandomColor())

实现随机画点功能:在图片范围内随机生成横纵坐标点,并使用随机颜色绘制噪点,循环执行50次以增加干扰密度。

def drawPoint(draw):
  for i in range(50):
    x = random.randint(0, width)
    y = random.randint(0, height)
    draw.point((x,y), fill=getRandomColor())

整合上述所有功能,构建完整的验证码生成方法。该方法依次创建背景、绘制字符、添加干扰线和噪点,最终保存为PNG格式图片。

def createImg():
  bg_color = getRandomColor()
  # 创建一张随机背景色的图片
  img = Image.new(mode="RGB", size=(width, height), color=bg_color)
  # 获取图片画笔,用于描绘字
  draw = ImageDraw.Draw(img)
  # 修改字体
  font = ImageFont.truetype(font="arial.ttf", size=36)
  for i in range(5):
    # 随机生成5种字符+5种颜色
    random_txt = getRandomChar()
    txt_color = getRandomColor()
    # 避免文字颜色和背景色一致重合
    while txt_color == bg_color:
      txt_color = getRandomColor()
    # 根据坐标填充文字
    draw.text((10 + 30 * i, 3), text=random_txt, fill=txt_color, font=font)
  # 画干扰线点
  drawLine(draw)
  drawPoint(draw)
  # 打开图片操作,并保存在当前文件夹下
  with open("test.png", "wb") as f:
    img.save(f, format="png")

经过完整流程生成的最终验证码图片效果如下。


上述步骤介绍了图片生成的具体方法。在实际应用中,可将生成的图片直接展示在前端页面,或通过API接口返回图片URL。若使用Django框架进行后端开发,需特别注意图片保存路径的配置与管理。

以上内容涵盖了图形验证码生成的完整流程,希望对读者的学习与开发有所帮助,欢迎继续支持本站获取更多技术资源。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表