如何用python生成动态随机验证码图片

2023-11-10 19:28

本文主要是介绍如何用python生成动态随机验证码图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

相信大部分小伙伴在登录注册页面都看到过这样的验证码图片:

今天就带大家用实现一波这种验证码图片的生成,这在Django开发中可以拿来即用~ 

1. 首先导入必要的库:

import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import os

验证码图片是需要画的,因此必须要使用python中画图工具,这里使用pillow,pip install pillow即可,然后在项目代码中导入PIL即可,注意,一定是PIL而不是pillow!如果你import pillow会报错。

2. 为了增加代码的可移植性,需要将字体文件的路径写成自动获取的绝对路径:

cur_filename = os.path.basename(os.path.abspath(__file__))
font_path = os.path.abspath(__file__).strip(cur_filename)
ttf_path = os.path.join(font_path, 'Monaco.ttf')

3. 由于验证码图片中的字体多种多样,需要额外下载需要的字体文件,我这里使用的是Monaco.ttf,下载地址http://d.xiazaiziti.com/en_fonts/fonts/m/Monaco.ttf

下载完成后,将字体文件放在代码目录同一级即可。

4. 用PIL画验证码图片

# 这里生成5个验证码元素:char_length=5
def check_code(width=120, height=30, char_length=5, font_file=ttf_path, font_size=28):code = []img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))draw = ImageDraw.Draw(img, mode='RGB')def rndChar():"""生成随机字母:return:"""# 如果想生成数字验证码用这一行# return str(random.randint(0, 9))# 生成字母验证码return chr(random.randint(65, 90))def rndColor():"""生成随机颜色:return:"""# 可以根据自己的需求改颜色return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))# 写文字font = ImageFont.truetype(font_file, font_size)for i in range(char_length):char = rndChar()code.append(char)h = random.randint(0, 4)# 将画布char_length等分,第一个字在第一等分:乘以0,第二个字在第二等分:乘以1……draw.text([i * width / char_length, h], char, font=font, fill=rndColor())# 写干扰点for i in range(40):draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())# 写干扰圆圈for i in range(40):draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())x = random.randint(0, width)y = random.randint(0, height)# PIL中draw.arc()方法是用来绘制圆弧的,圆弧所在正切矩形左上角坐标为(x, y)和右下角坐标为(x+4, y+4),圆弧起始角度为0,终止角度为90度draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())# 画干扰线for i in range(5):x1 = random.randint(0, width)y1 = random.randint(0, height)x2 = random.randint(0, width)y2 = random.randint(0, height)# draw.line用来绘制直线,(x1, y1)是线起始点坐标,终止点坐标为(x2, y2)draw.line((x1, y1, x2, y2), fill=rndColor())img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)# img是图片,code是图片中元素的值,在web开发中可以用来校验用户输入的值是否等于验证码图片中的值return img, ''.join(code)

我们来验证一下:

if __name__ == '__main__':import osprint(os.getcwd())img, _ = check_code()with open('test.png', 'wb') as f:img.save(f, format='png')

在当前路径下会生成一张图片,名为test.png:

 

大功告成!小伙伴们快来试一试吧~

 

这篇关于如何用python生成动态随机验证码图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384762

相关文章

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处