当前位置: 首页 > news >正文

使用python,生成数字在图片上的验证码

在这里插入图片描述
许多网站在注册时都要求输入验证码,这样做为了防止被程序恶意注册和保证网站安全

1. Pillow

PIL(Python Imaging Library)是一个强大的python图像处理库,只是支持到python2.7, Pillow虽说是PIL的一个分支,但是pillow支持python3.x,已经发展成比PIL本身更具活力的图像处理库,我们使用Pillow来生成验证码,安装方式为

pip install Pillow

2. 生成一张指定大小随机颜色的图片

2.1 随机颜色

颜色的处理使用(r,g,b)格式,r, g, b 的范围是[0, 255], 使用random模块的randint方法生成3个随机数

def random_color():c1 = random.randint(0, 255)c2 = random.randint(0, 255)c3 = random.randint(0, 255)return c1, c2, c3

2.2 生成一张指定大小的图片

def random_color():c1 = random.randint(0, 255)c2 = random.randint(0, 255)c3 = random.randint(0, 255)return c1, c2, c3def generate_picture(width=120, height=35):image = Image.new('RGB', (width, height), random_color())return imageif __name__ == '__main__':image = generate_picture()image.save('test.png')

在这里插入图片描述

现在还只是生成了一张颜色随机的图片,接下来要在图片上面写上随机数字和字母

3. 在图片上写上随机数字和字母

3.1 生成随机数字和字母

def get_random_str():'''获取一个随机字符, 数字或小写字母:return:'''random_num = str(random.randint(0, 9))random_low_alpha = chr(random.randint(97, 122))random_char = random.choice([random_num, random_low_alpha])return random_char

使用random模块提供的随机函数生成指定长度的字符串

3.2 在image对象上画数字和字母

def draw_str(count, image, font_size):"""在图片上写随机字符:param count: 字符数量:param image: 图片对象:param font_size: 字体大小:return:"""draw = ImageDraw.Draw(image)# 获取一个font字体对象参数是ttf的字体文件的目录,以及字体的大小font_file = os.path.join('Andale Mono.ttf')font = ImageFont.truetype(font_file, size=font_size)temp = []for i in range(count):random_char = random_str()draw.text((10+i*30, -2), random_char, random_color(), font=font)temp.append(random_char)valid_str = "".join(temp)    # 验证码return valid_str, imageif __name__ == '__main__':image = generate_picture()valid_str, image = draw_str(4, image, 35)image.save('test.png')

在这里插入图片描述

创建一个ImageDraw.Draw对象,在image上画随机字符,你可以设置字体, 我使用了Andale Mono.ttf, mac电脑上在/System/Library/Fonts 目录下找到字体,其他系统也有各自的字体文件,将字体文件复制到与脚本相同的目录下。

4. 制造噪点

为了防止验证码被轻易的破解,还应该在图片上制造一些噪点,随机画几条线,随机画几个点

def noise(image, width=120, height=35, line_count=3, point_count=20):''':param image: 图片对象:param width: 图片宽度:param height: 图片高度:param line_count: 线条数量:param point_count: 点的数量:return:'''draw = ImageDraw.Draw(image)for i in range(line_count):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=random_color())# 画点for i in range(point_count):draw.point([random.randint(0, width), random.randint(0, height)], fill=random_color())x = random.randint(0, width)y = random.randint(0, height)draw.arc((x, y, x + 4, y + 4), 0, 90, fill=random_color())return imageif __name__ == '__main__':image = generate_picture()valid_str, image = draw_str(4, image, 35)image = noise(image)image.save('test.png')

在这里插入图片描述

5. 生成base64编码的图片

实践中,如果是生成网站注册使用的验证码图片,一般来说不会将其保存到图片文件中,因为这会生成大量的小图片,完全没必要。我们可以将图片的内容保存到BytesIO对象中,最终生成base64编码的图片,这样,向前端传回去的就是字符串,格式为

data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAH...

data:image/jpeg;base64 这一段是固定写法,逗号剩余的部分是图片经过base64编码后的字符串

def valid_code():"""生成图片验证码,并对图片进行base64编码:return:"""image = generate_picture()valid_str, image = draw_str(4, image, 35)image = noise(image)f = BytesIO()image.save(f, 'png')        # 保存到BytesIO对象中, 格式为pngdata = f.getvalue()f.close()encode_data = base64.b64encode(data)data = str(encode_data, encoding='utf-8')img_data = "data:image/jpeg;base64,{data}".format(data=data)return valid_str, img_dataif __name__ == '__main__':print(valid_code())

6. 全部代码

为了向你阐述生成验证码图片的过程,我将整个过程进行拆解,因此代码也被拆解的凌乱,你可以将这些代码整合,以便在实际应用中使用

import os
import random
import base64
from io import BytesIO
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFontdef random_color():c1 = random.randint(0, 255)c2 = random.randint(0, 255)c3 = random.randint(0, 255)return c1, c2, c3def generate_picture(width=120, height=35):image = Image.new('RGB', (width, height), random_color())return imagedef random_str():'''获取一个随机字符, 数字或小写字母:return:'''random_num = str(random.randint(0, 9))random_low_alpha = chr(random.randint(97, 122))random_char = random.choice([random_num, random_low_alpha])return random_chardef draw_str(count, image, font_size):"""在图片上写随机字符:param count: 字符数量:param image: 图片对象:param font_size: 字体大小:return:"""draw = ImageDraw.Draw(image)# 获取一个font字体对象参数是ttf的字体文件的目录,以及字体的大小font_file = os.path.join('Andale Mono.ttf')font = ImageFont.truetype(font_file, size=font_size)temp = []for i in range(count):random_char = random_str()draw.text((10+i*30, -2), random_char, random_color(), font=font)temp.append(random_char)valid_str = "".join(temp)    # 验证码return valid_str, imagedef noise(image, width=120, height=35, line_count=3, point_count=20):''':param image: 图片对象:param width: 图片宽度:param height: 图片高度:param line_count: 线条数量:param point_count: 点的数量:return:'''draw = ImageDraw.Draw(image)for i in range(line_count):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=random_color())# 画点for i in range(point_count):draw.point([random.randint(0, width), random.randint(0, height)], fill=random_color())x = random.randint(0, width)y = random.randint(0, height)draw.arc((x, y, x + 4, y + 4), 0, 90, fill=random_color())return imagedef valid_code():"""生成图片验证码,并对图片进行base64编码:return:"""image = generate_picture()valid_str, image = draw_str(4, image, 35)image = noise(image)f = BytesIO()image.save(f, 'png')        # 保存到BytesIO对象中, 格式为pngdata = f.getvalue()f.close()encode_data = base64.b64encode(data)data = str(encode_data, encoding='utf-8')img_data = "data:image/jpeg;base64,{data}".format(data=data)return valid_str, img_dataif __name__ == '__main__':print(valid_code())

相关文章:

使用python,生成数字在图片上的验证码

许多网站在注册时都要求输入验证码,这样做为了防止被程序恶意注册和保证网站安全 1. Pillow PIL(Python Imaging Library)是一个强大的python图像处理库,只是支持到python2.7, Pillow虽说是PIL的一个分支,但是pillow支持python3.x&#xff…...

阿晨的运维笔记 | CentOS部署Docker

使用yum安装 # step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # Step 3: 更新并安装 …...

自动化运维:Ansible基础与命令行模块操作

目录 一、理论 1. Ansible 2.部署Ansible自动化运维工具 3.Ansible常用模块 4.hostsinverntory主机清单 二、实验 1.部署Ansible自动化运维工具 2.ansible 命令行模块 3.hostsinverntory主机清单 三、问题 1. ansible远程shell失败 2.组变量查看webservers内主机ip报…...

深度学习6:自然语言处理-Natural language processing | NLP

目录 NLP 为什么重要? 什么是自然语言处理 – NLP NLP 的2大核心任务 自然语言理解 – NLU|NLI 自然语言生成 – NLG NLP(自然语言处理) 的5个难点 NLP 的4个典型应用 NLP 的 2 种途径、3 个核心步骤 总结 自然语言处理 NLP 为什么重要? “语言…...

Mysql多表操作

文章目录 1. 概述2. 内连接3. 外连接4. 自连接5. 联合查询-union,union all6. 子查询 1. 概述 在项目开发中,在进行数据库表结构设计是,会根据业务需求和业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所…...

【leetcode 力扣刷题】数学题之计算次幂//次方:快速幂

利用乘法求解次幂问题—快速幂 50. Pow(x, n)372. 超级次方 50. Pow(x, n) 题目链接:50. Pow(x, n) 题目内容: 题目就是要求我们去实现计算x的n次方的功能函数,类似c的power()函数。但是我们不能使用power()函数直接得到答案,那…...

【核心复现】基于改进灰狼算法的并网交流微电网经济优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Cannal监听binlog

文章目录 一、canal概念二、canal使用场景四、Canal工作原理Mysql主从复制原理 binlog中的二进制日志binlog格式选择 Canal消费方式应用实践总结 一、canal概念 canal是用java开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件。目前,ca…...

从零开发JavaWeb入门项目--十天掌握

原文网址:从零开发JavaWeb入门项目--十天掌握_IT利刃出鞘的博客-CSDN博客 简介 这是一个靠谱的JavaWeb入门项目实战,名字叫蚂蚁爱购。从零开发项目,视频加文档,十天就能学会开发JavaWeb项目,教程路线是:搭…...

数据结构——哈希表

哈希表 这里没有讲哈希表底层的概念,什么转红黑树,什么链表的,这篇文章主要讲的是如何用C实现哈希表,以及哈希表的基本概念。后面我会出一篇文章来讲C中hashmap中的底层逻辑的知识。 哈希表的概念 哈希表是一种数据结构&#xff0…...

Kafka3.0.0版本——手动调整分区副本示例

目录 一、服务器信息二、启动zookeeper和kafka集群2.1、先启动zookeeper集群2.2、再启动kafka集群 三、手动调整分区副本3.1、手动调整分区副本的前提条件3.2、手动调整分区副本的示例需求3.3、手动调整分区副本的示例 一、服务器信息 四台服务器 原始服务器名称原始服务器ip节…...

玩客云 线刷Armbian 搭配Alist 阿里云盘 Jellyfin NovaVideoPlayer搞电视墙

啰嗦的背景 喜欢看电影,买了个投影仪,是这一切折腾的开端。 投影仪虽然有当贝系统,但是想看的电影总是需要**电视会员,那我肯定是不用的。因为有爱腾优的会员,最开始都是使用手机投屏,当呗的投影仪好就好…...

9月1日,每日信息差

1、华大智造:已实现海外基因测序仪和测序试剂的量产,实现了海外基因测序仪和测序试剂的量产 2、邮储银行下调定存利率。价格表显示,整存整取,一年期存款年利率为1.58%,二年期年利率为1.85%,三年期年利率为…...

【大数据】Flink 详解(六):源码篇 Ⅰ

Flink 详解(六):源码篇 Ⅰ 55、Flink 作业的提交流程?56、Flink 作业提交分为几种方式?57、Flink JobGraph 是在什么时候生成的?58、那在 JobGraph 提交集群之前都经历哪些过程?59、看你提到 Pi…...

ShardingSphere——弹性伸缩原理

摘要 支持自定义分片算法,减少数据伸缩及迁移时的业务影响,提供一站式的通用弹性伸缩解决方案,是 Apache ShardingSphere 弹性伸缩的主要设计目标。对于使用单数据库运行的系统来说,如何安全简单地将数据迁移至水平分片的数据库上…...

Linux项目自动化构建工具-make/Makefile

一、什么是make和makefile make是一条指令 Makefile是当前目录下的一个文件 二、makefile文件编写 依赖关系::前为要目标文件,后为其依赖的文件 依赖方法:用依赖文件生成目标文件的具体指令 简便写法: $:表示目标文件 $^:表示…...

Python爬虫实战:自动化数据采集与分析

在大数据时代,数据采集与分析已经成为了许多行业的核心竞争力。Python作为一门广泛应用的编程语言,拥有丰富的爬虫库,使得我们能够轻松实现自动化数据采集与分析。本文将通过一个简单的示例,带您了解如何使用Python进行爬虫实战。…...

视频智能分析平台EasyCVR安防视频汇聚平台助力森林公园防火安全的应用方案

一、研发背景 随着经济的发展和人们生活水平的提高,越来越多的人喜欢在周末去周边的森林公园旅游,享受大自然的美景,并进行野炊和烧烤等娱乐活动。然而,近年来由于烟蒂和烧烤碳渣等人为因素,森林公园火灾频繁发生。森…...

跨境做独立站,如何低成本引流?

大家都知道,海外的消费习惯与国内不同,独立站一向是海外消费者的最喜欢的购物方式之一,这也吸引了许多跨境商家开设独立站。 独立站不同于其他的第三方平台,其他平台可以靠平台自身流量来获得转化,而独立站本身没有流…...

leetcode55.跳跃游戏 【贪心】

题目: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...