使用pillow创建动态图形验证码

news2024/10/7 10:23:43

使用pillow创建动态图形验证码

#安装pillow模块:pip3 install pillow
from PIL import Image,ImageDraw,ImageFont
import random
import string

def id_code(width,height,bit,font_file,font_size):
    """
    功能:生成随机图片验证码
    :param width: 图片宽度
    :param height: 图片高度
    :param bit:验证码位数
    :param font_file:字体文件路径和文件名
    :param font_size:字体大小
    :return:
        code:验证码(字符串)
        im:Image图片对象
    """
    im=Image.new(mode='RGB',size=(width,height),color=(255,255,255))   #创建Image对象
    draw = ImageDraw.Draw(im)                                          #创建ImageDraw对象
    code_list=[]                                                       #验证码列表
    x=width/20                                                         #x坐标初始值
    font = ImageFont.truetype(font=font_file, size=font_size)          #创建字体对象
    for i in range(bit):                                               #循环绘制验证码字符
        y = random.randrange(0, int(height/3))
        color = (random.randint(0,255),random.randint(0,255),random.randint(0,255))       #生成随机颜色
        var = random.choice(string.ascii_letters + string.digits)
        draw.text((x,y),text=var,fill=color,font=font)
        x+=font_size
        code_list.append(var)
    code=''.join(code_list)

    for i in range(30):                                                #循环绘制干扰点
        x = random.randrange(1, width - 1)
        y = random.randrange(1, height - 1)
        color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))   #生成随机颜色
        draw.ellipse((x,y,x+2,y+2), fill=color)

    for i in range(2):                                                 #循环绘制干扰线
        y = random.randrange(5, height - 5)
        color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))   #生成随机颜色
        draw.line((0,y,width,y),width=1,fill=color)

    return code,im                                                     #返回验证码字符串和Image对象

code,im=id_code(120,50,4,'c:/windows/Fonts/simsun.ttc',30)             #调用函数
print(code)                                                            #可以获取验证码字符串
im.show()                                                              #显示图片

每次调用都能生成一个不同的图片验证码,并返回验证码字符串

返回结果:

code= bW8h

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1560904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基本指令篇

在前边,我们已经了解过了Linux操作系统的发展和应用,从该篇起,就正式进入对Linux的学习。 今天我们就来在Xshell上远程登录我们的云服务器。首先我们要知道自己云服务器的公网ip,然后修改一下密码。 点击跳转 修改完密码之后我们…

项目级AIMS手术麻醉信息系统源码,C#手麻系统源码,应用案例+演示

手术麻醉信息系统可以实现手术室监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集,采集的数据能据如实准确地反映患者生命体征参数的变化,并实现信息高度共享,根据采集结果,综合其他患者数据,自动生成手术麻醉…

U8二次开发-钉钉集成

钉钉开放平台作为企业沟通和协作的重要工具,其技术的每一次迭代都为企业带来了新的机遇和挑战。随着企业对于高效沟通和智能化管理的需求日益增长,钉钉平台的SDK更新显得尤为重要。把传统的U8与钉钉平台集成,可以有效的将业务功能和角色进行前移,打破应用系统二八原则,即8…

第三方系统自动登录BBS For Discuz! X3.4/X3.5

apache安装 service apache2 restart PHP安装 php.info php.ini mysql安装 Discuz! X3.4/X3.5安装 跳转BBS 传参 写入BBS 登录BBS

一文教会女朋友学会日常Git使用!Git知识总结

文章目录 一文教会女朋友学会日常Git使用!Git知识总结一、git基本知识了解1.git简介2.git区域了解3.git常用命令 二、常用工作场景1.克隆远程仓库,把仓库代码拉到本地2.推送代码到远程仓库(1)本地代码和远程仓库版本相同&#xff…

GCNet: 非局部网络与挤压-激励网络的融合与超越

摘要 非局部网络(NLNet)通过为每个查询位置聚合特定于查询的全局上下文,为捕获长距离依赖关系提供了一个开创性的方法。然而,经过严格的实证分析,我们发现非局部网络所建模的全局上下文在图像中的不同查询位置几乎相同…

分享 5 个提高技术领导力的技巧

技术领导力于很多人而言都是谜一般的存在。有观点认为,实战经验丰富的资深开发最终只有成为技术管理者才能继续成长。从某些方面来看,这可能是对的,但考虑到公司结构和规章制度等,想要完成从「个人贡献者」到「技术管理者」的跨越…

ModuleNotFoundError: No module named ‘utils.utils pytorch项目报错

首先呢会报错是因为引入的问题 代码是这样的但是sys.path.append的功能仅限当前的目录 sys.path.append("..") from utils.utils import MyDataset, validate, show_confMat应该加下面的文件路径 sys.path.append("..") from Code.utils.utils import My…

基于8086七路抢答器倒计时仿真设计

**单片机设计介绍,基于8086七路抢答器倒计时仿真设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086的七路抢答器倒计时仿真设计是一个结合了微处理器控制、抢答逻辑以及倒计时功能的综合性项目。该系统能够模拟七路抢…

【树状数组专题】【蓝桥杯备考训练】:数星星、动态求连续区间和、一个简单的整数问题、一个简单的整数问题2【已更新完成】

目录 1、数星星(《信息学奥赛一本通》 & ural 1028) 思路: 基本思路: 树状数组经典三函数: 1、lowbit()函数 2、query()函数 3、add()函数 最终代码: 2、动态求连续区间和(《信息学奥赛一本…

智能仪器替代技术工程师重复工作 专注生产方案优化!

关键词:智能仪器,测径仪,测宽仪,测厚仪,直线度测量仪 在当今竞争激烈的市场环境下,企业需要不断提高生产效率和质量,以满足客户的需求。而技术工程师在生产过程中扮演着至关重要的角色,但他们的时间和精力往往被重复的工作所占据&…

FPGA寄存器 Vivado IP核

1. 今日任务 小梅哥视频:21A 认识并理解FPGA中的存储器模型_哔哩哔哩_bilibili 21B 学习使用Vivado中的存储器资源_哔哩哔哩_bilibili 2. FPGA中的存储器类型 只读ROM eg.CMOS摄像头初始化、DDS信号发生器(固定波形数据的…

docker-compse安装es(包括IK分词器扩展)、kibana、libreoffice

Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。 Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据…

【NOI】树 2164 - 子结点的数量 2165 - 子结点的数量(2)1775 - 谁的孙子最多1776 - 谁的孙子最多II

文章目录 问题一:2164 - 子结点的数量问题二:2165 - 子结点的数量(2)问题三:1775 - 谁的孙子最多问题四:1776 - 谁的孙子最多II 问题一:2164 - 子结点的数量 类型:树 题目描述&…

mysql 故障排除与优化

目录 一 mysql 逻辑架构图 二 msql单实例常见故障 1, 故障一 2, 故障二 3, 故障三 4, 故障四 5, 故障五 6, 故障六 7, 故障七 8, 故障八 三 mysql 主从环境常见故障 1, 故障一 2, 故障二 3, 故障三 四 mysq 常见优化 1,硬件优化…

校园二手书交易|基于springboot的校园二手书交易设计与实现(附项目源码+论文)

基于springboot校园二手书交易平台的设计与实现 目录 基于springboot校园二手书交易平台的设计与实现 一、摘要 二、相关技术 java、tomcat、mysql、spring、sprigBoot、mybatis、query、vue 三、系统设计 3.1 整体功能设计图 3.2 功能具体细节设计 四、数据库设计 五…

砍树c++

题目&#xff1a; 代码&#xff1a; #include<bits/stdc.h> using namespace std; long long n,m,a[100000005]; bool jltm(int x){long long sum0;for(int i1;i<n;i){if(a[i]>x) sumsuma[i]-x;}//计算此时锯片高度砍掉的木材if(sum>m) return 1;else return 0…

城市排涝与海绵城市教程

原文链接&#xff1a;城市排涝与海绵城市教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247599633&idx3&snbfe71e1b4f918864fdfe8e33db8a104b&chksmfa8207f6cdf58ee03dea20cc64bb106aadd729fcbf0a1ce3f920d3e767f78e53fa6a094d8d2a&token21066…

Linux_应用篇(02) 文件 I/O 基础

本章给大家介绍 Linux 应用编程中最基础的知识&#xff0c;即文件 I/O&#xff08;Input、 Outout&#xff09; &#xff0c; 文件 I/O 指的是对文件的输入/输出操作&#xff0c;说白了就是对文件的读写操作&#xff1b; Linux 下一切皆文件&#xff0c;文件作为 Linux 系统设计…

微信小程序wx.navigateTo无法跳转到Component组件问题解决。(共享元素动画必备)

关于Component构造器官方是有文档说明的&#xff0c;然后官方文档内部也给出了组件是可以通过像pages一样跳转的。但是官方文档缺少了必要的说明&#xff0c;会引起wx.navigateTo无法跳转到组件问题&#xff01; 以下是官方文档截图&#xff1a; 解决方式&#xff1a; 组件创建…