Python使用PIL模块生成随机验证码


Posted in Python onNovember 21, 2017

Python生成随机验证码,需要使用PIL模块,具体内容如下

安装:

pip3 install pillow

基本使用

1. 创建图片

from PIL import Image
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
 
# 在图片查看器中打开
# img.show()
 
# 保存在本地
with open('code.png','wb') as f:
 img.save(f,format='png')

2. 创建画笔,用于在图片上画任意内容

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')

3. 画点

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示坐标
# 第二个参数:表示颜色
draw.point([100, 100], fill="red")
draw.point([300, 300], fill=(255, 255, 255))

4. 画线

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标和结束坐标
# 第二个参数:表示颜色
draw.line((100,100,100,300), fill='red')
draw.line((100,100,300,100), fill=(255, 255, 255))

5. 画圆

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标和结束坐标(圆要画在其中间)
# 第二个参数:表示开始角度
# 第三个参数:表示结束角度
# 第四个参数:表示颜色
draw.arc((100,100,300,300),0,90,fill="red")

6. 写文本

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标
# 第二个参数:表示写入内容
# 第三个参数:表示颜色
draw.text([0,0],'python',"red")

7. 特殊字体文字

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示字体文件路径
# 第二个参数:表示字体大小
font = ImageFont.truetype("kumo.ttf", 28)
# 第一个参数:表示起始坐标
# 第二个参数:表示写入内容
# 第三个参数:表示颜色
# 第四个参数:表示颜色
draw.text([0, 0], 'python', "red", font=font)

图片验证码

import random

def check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', 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 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)
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)
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), fill=rndColor())

img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
return img,''.join(code)


if __name__ == '__main__':
# 1. 直接打开
# img,code = check_code()
# img.show()

# 2. 写入文件
# img,code = check_code()
# with open('code.png','wb') as f:
# img.save(f,format='png')

# 3. 写入内存(Python3)
# from io import BytesIO
# stream = BytesIO()
# img.save(stream, 'png')
# stream.getvalue()

# 4. 写入内存(Python2)
# import StringIO
# stream = StringIO.StringIO()
# img.save(stream, 'png')
# stream.getvalue()

pass

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 代码性能优化技巧分享
Aug 07 Python
在Django中编写模版节点及注册标签的方法
Jul 20 Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 Python
深入浅析Python中的yield关键字
Jan 24 Python
python 对txt中每行内容进行批量替换的方法
Jul 11 Python
pandas使用apply多列生成一列数据的实例
Nov 28 Python
PyTorch搭建多项式回归模型(三)
May 22 Python
Python如何计算语句执行时间
Nov 22 Python
python读取ini配置文件过程示范
Dec 23 Python
基于Tensorflow使用CPU而不用GPU问题的解决
Feb 07 Python
通用的Django注册功能模块实现方法
Feb 05 Python
python解包概念及实例
Feb 17 Python
Python3中条件控制、循环与函数的简易教程
Nov 21 #Python
Python3 循环语句(for、while、break、range等)
Nov 20 #Python
Python虚拟环境项目实例
Nov 20 #Python
Python插件virtualenv搭建虚拟环境
Nov 20 #Python
使用tensorflow实现AlexNet
Nov 20 #Python
Django在win10下的安装并创建工程
Nov 20 #Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 #Python
You might like
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
PHP中Date获取时间不正确怎么办
2008/06/05 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
jQuery学习笔记(4)--Jquery中获取table中某列值的具体思路
2013/04/10 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
2016/01/26 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
JavaScript遍历求解数独问题的主要思路小结
2016/06/12 Javascript
Javascript中的 “&” 和 “|” 详解
2017/02/02 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
Python处理JSON数据并生成条形图
2016/08/05 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
高二生物教学反思
2014/01/27 职场文书
会计自我鉴定
2014/02/04 职场文书
销售员岗位职责
2014/06/09 职场文书
绿色出行口号
2014/06/18 职场文书
2014年双拥工作总结
2014/11/21 职场文书
2015公司年度工作总结
2015/05/14 职场文书
干部考核工作总结2015
2015/07/24 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS