使用Python生成一张用于登陆验证的字符图片
时间:2022-04-26
本文章向大家介绍使用Python生成一张用于登陆验证的字符图片,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Python Pillow库的简单使用
使用Python生成一张用于登陆验证的字符图片, 代码使用了Pillow,Anaconda已经默认安装此库,如果你使用的是官方版的Python需要先下载此库。
代码如下,在注释中予以说明:
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
#定义一个生成随机字符的函数 ASII码表 48-57: 0-9 65-90: A-Z 97-122: a-z
def randChar():
i = random.randint(0, 2)
if i == 0:
return chr(random.randint(65, 90)) #大写字符
elif i == 1:
return chr(random.randint(97, 122)) #小写字符
else:
return chr(random.randint(48,57)) #数字
#定义一个生成图片的颜色(颜色尽量浅,以免字符用户都看不清楚)
def randColor1():
return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))
#再定义一个生成字体的颜色(颜色尽量深,在尽可能无法被机器识别的前提下,让用户看清楚)
def randColor2():
return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))
#生成图片宽度
width = 60 * 8
#生成图片高度
height = 60
#创建image对象
image = Image.new('RGB', (width, height), (255, 255, 255))
#创建Font对象
font = ImageFont.truetype('arial.ttf', 36)
#创建Draw对象
draw = ImageDraw.Draw(image)
#画图
for x in range(width):
for y in range(height):
draw.point((x, y), fill = randColor1())
#point两个参数 第一个是坐标(tuple) 第二个是颜色(C语言3个,横纵坐标算2个)
#加字
for t in range(8):
draw.text((60 * t + random.randint(0, 9) * randomrandint(0,5), random.randint(0, 9)), randChar(), font = font, fill = randColor2())
#draw.text 4个参数 坐标 字符 字体 颜色
#第一个参数大量使用randint 尽可能使得字变得散
#添加模糊效果
image = image.filter(ImageFilter.BLUR)
image.save('code.jpg', 'jpeg')
有可以改进的地方,把import random
改成 from random import randint
就可以不在randint
指明random了。
无注释纯净版:
from PIL import Image, ImageDraw, ImageFont, ImageFilter
from random import randint
def randChar():
i = randint(0, 2)
if i == 0:
return chr(randint(65, 90))
elif i == 1:
return chr(randint(97, 122))
else:
return chr(randint(48,57))
def randColor1():
return (randint(64, 255), randint(64, 255), randint(64, 255))
def randColor2():
return (randint(32, 127), randint(32, 127), randint(32, 127))
width = 60 * 8
height = 60
image = Image.new('RGB', (width, height), (255, 255, 255))
font = ImageFont.truetype('arial.ttf', 36)
draw = ImageDraw.Draw(image)
for x in range(width):
for y in range(height):
draw.point((x, y), fill = randColor1())
for t in range(8):
draw.text((60 * t + randint(0, 9) * randint(0,5), randint(0, 9)), randChar(), font = font, fill = randColor2())
image = image.filter(ImageFilter.BLUR)
image.save('code.jpg', 'jpeg')
结果:
- P2885 [USACO07NOV]电话线Telephone Wire
- 实战-Fluxion与wifi热点伪造、钓鱼、中间人攻击、wifi破解
- 【下载】PyTorch实现的神经网络翻译框架——机器翻译工具包 nmtpytorch
- P2605 [ZJOI2010]基站选址
- MYSQL之索引原理与慢查询优化
- MYSQL之视图、触发器、存储过程、函数、事物、数据库锁和数据库备份
- P1452 Beauty Contes
- Python基础(一)
- P1452 Beauty Contes(旋转卡壳版)
- python常见模块之os模块
- BZOJ 2127: happiness(最小割解决集合划分)
- lightswitch 添加 TreeView 控件
- P3227 [HNOI2013]切糕
- python常见模块之random模块
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP与SQL语句写一句话木马总结
- golang实现php里的serialize()和unserialize()序列和反序列办法详解
- php和html的区别点详细总结
- 详解在YII2框架中使用UEditor编辑器发布文章
- 在Laravel的Model层做数据缓存的实现
- Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
- php连接mysql数据库最简单的实现方法
- 解决laravel id非自增 模型取回为0 的问题
- PHP7.0连接DB操作实例分析【基于mysqli】
- Laravel获取当前请求的控制器和方法以及中间件的例子
- laravel中数据显示方法(默认值和下拉option默认选中)
- laravel请求参数校验方法
- ThinkPHP 5.x远程命令执行漏洞复现
- 关于php开启错误提示的总结
- php创建类并调用的实例方法