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自动化测试之setUp与tearDown实例
Sep 28 Python
跟老齐学Python之私有函数和专有方法
Oct 24 Python
Python列表生成器的循环技巧分享
Mar 06 Python
使用Python脚本操作MongoDB的教程
Apr 16 Python
python设计模式大全
Jun 27 Python
在cmd命令行里进入和退出Python程序的方法
May 12 Python
python面试题小结附答案实例代码
Apr 11 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
Mar 25 Python
Python虚拟环境venv用法详解
May 25 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
python利用opencv实现颜色检测
Feb 23 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
Vue概念及常见命令介绍(1)
2016/12/08 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
十分钟带你快速了解React16新特性
2017/11/10 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
Pyecharts地图显示不完成问题解决方案
2020/05/11 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
写自荐信的注意事项
2014/03/09 职场文书
春节联欢晚会主持词范文
2014/03/24 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
今日说法观后感
2015/06/08 职场文书
如何书写邀请函?
2019/06/24 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS
浅谈MySQL函数
2021/10/05 MySQL