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常用函数详解
Sep 13 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
Django入门使用示例
Dec 12 Python
Python之reload流程实例代码解析
Jan 29 Python
Python学生信息管理系统修改版
Mar 13 Python
python批量赋值操作实例
Oct 22 Python
python使用magic模块进行文件类型识别方法
Dec 08 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
tensorflow 重置/清除计算图的实现
Jan 19 Python
基于TensorFlow中自定义梯度的2种方式
Feb 04 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 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删除数组元素示例分享
2014/02/17 PHP
php cli换行示例
2014/04/22 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
070823更新的一个[消息提示框]组件 兼容ie7
2007/08/29 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
python利用7z批量解压rar的实现
2019/08/07 Python
Python-openCV读RGB通道图实例
2020/01/17 Python
Python @property及getter setter原理详解
2020/03/31 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
马来西亚演唱会订票网站:StubHub马来西亚
2018/10/18 全球购物
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
历史学专业个人的自我评价
2013/10/13 职场文书
《鸟的天堂》教学反思
2014/02/27 职场文书
毕业评语大全
2014/05/04 职场文书
三八活动策划方案
2014/08/17 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
计算机实训报告范文
2014/11/05 职场文书
jquery插件实现悬浮的菜单
2021/04/24 jQuery