图片验证码制作(附源码)

本文介绍了如何使用Python中的PIL库生成包含随机数字、大小写字母的验证码图片,包括添加噪点、噪线和弧线等效果。
摘要由CSDN通过智能技术生成

图片验证码生成思路

1. 准备工作
  • 安装必要的库:确保安装了Pillow库(PIL的更新版),用于图像处理。
  • 准备字体文件:选择一个或多个字体文件,用于在验证码图像上绘制文本。确保这些字体文件在生成验证码的脚本可以访问的路径下。
2. 生成随机字符串
  • 使用Python的random模块和string模块来生成一个随机字符串。这个字符串可以包含大写字母、小写字母和数字,长度可以根据需要设置。
3. 创建图像
  • 使用Pillow库的Image.new()方法创建一个新的图像对象。指定图像的大小(宽度和高度)、模式(如’RGB’)和背景颜色。
4. 计算文本位置
  • 使用ImageDraw.Draw().textsize()方法获取随机字符串在指定字体下的大小(宽度和高度)。
  • 根据图像的大小和文本的大小,计算文本在图像中的最佳位置(通常是居中对齐)。
5. 绘制文本
  • 使用ImageDraw.Draw().text()方法在图像上绘制随机字符串。指定文本的位置、字体、大小和颜色。
6. 添加干扰元素
  • 为了增加自动化识别的难度,可以在图像上添加一些干扰元素,如噪点、线条、曲线等。
    • 噪点可以通过在图像的随机位置绘制随机颜色的点来实现。
    • 线条和曲线可以通过ImageDraw.Draw().line()ImageDraw.Draw().arc()等方法来绘制。
  • 这些干扰元素应该足够复杂,但又不能过于影响人类用户的识别。
7. 保存或显示图像
  • 使用Image.save()方法将验证码图像保存到文件中。可以指定文件的格式(如PNG)和名称。
  • 或者,如果只是想在屏幕上查看验证码,可以使用Image.show()方法(注意:这通常只在支持GUI的环境中有效)。
8. 记录和验证
  • 在生成验证码时,将随机字符串和可能的其他验证信息(如生成时间戳)存储在服务器端的某个地方(如数据库、缓存或会话中)。
  • 当用户提交验证码时,将用户输入的字符串与存储的随机字符串进行比较,以验证用户是否是人类。
9. 安全性考虑
  • 确保验证码的生成过程足够随机,避免使用可预测的模式。
  • 限制验证码的生成频率,以防止自动化工具频繁请求新的验证码。
  • 考虑到验证码的过期时间,避免使用过期的验证码进行验证。
  • 监控验证码的使用情况,以检测任何潜在的滥用行为。


from random import randint , choice
from PIL import Image , ImageDraw , ImageFont

# 制作随机验证码:数字,大小写字母
def get_random_code():
    # 随机数字
    number = str(randint(0,9))
    # 随机大写字母
    upper = chr(randint(65 , 90))
    # 随机小写字母
    lower = chr(randint(97 , 122))
    # 在大小字母和数字中随机获取一个
    code = choice([number , upper , lower])
    return code

# 获取随机颜色
def get_color():
    return (randint(0,255),randint(0,255),randint(0,255))

# 制作图片
def create_img():
    # 创建图片对象
    img = Image.new(mode='RGB' , size=(150 , 30) , color=get_color())
    # 创建画笔工具
    draw = ImageDraw.Draw(img)

    # 制作图片噪点
    # 噪点
    for i in range(70):
        # point([xy:图片坐标] , fill颜色)
        draw.point([randint(0,150) , randint(0,30)] , fill=get_color())

    # 噪线
    for i in range(10):
        # line([xy:起始和终点图片坐标] , fill颜色)
        draw.line([randint(0, 150), randint(0, 30),randint(0, 150), randint(0, 30)], fill=get_color())

    # 弧线
    x = randint(0, 150)
    y = randint(0, 30)
    for i in range(10):
        # line([xy:起始和终点图片坐标] , fill颜色)
        draw.arc([x, y, x + 2 , y + 2], 0, 90,fill=get_color())

    # 设置字体 , 导入字体文件, 设置字体大小
    font = ImageFont.truetype('fonts/Georgia.ttf' , 24)
    # 生成验证码
    for i in range(5):
        c = get_random_code()
        # 将获取到的验证码写如到图片中
        draw.text((10+30*i , 2) , text=c , fill=get_color() , font=font)

    # 图片保存成为文件
    f = open('yzm.png' , 'wb')
    # 将制作好的图片保存
    img.save(f , format='png')
    f.close()

create_img()

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攒了一袋星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值