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处理html转义字符的方法详解
Jul 01 Python
python解决网站的反爬虫策略总结
Oct 26 Python
django缓存配置的几种方法详解
Jul 16 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
解决python3中cv2读取中文路径的问题
Dec 05 Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
Python如何批量获取文件夹的大小并保存
Mar 31 Python
深入理解Python 多线程
Jun 16 Python
详解python 条件语句和while循环的实例代码
Dec 28 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
php编写一个简单的路由类
2011/04/13 PHP
php动态绑定变量的用法
2015/06/16 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
js实现右键自定义菜单
2016/12/03 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
JS处理一些简单计算题
2018/02/24 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
[01:01]2020完美高校联赛(秋)西安落幕
2021/03/11 DOTA
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
python3.6生成器yield用法实例分析
2019/08/23 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
英国自行车商店:AW Cycles
2021/02/24 全球购物
中专生职业生涯规划书范文
2013/12/29 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
加入学生会演讲稿
2014/04/24 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
员工安全责任协议书
2016/03/22 职场文书