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中for循环详解
Jan 17 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
python如何通过twisted实现数据库异步插入
Mar 20 Python
查看django执行的sql语句及消耗时间的两种方法
May 29 Python
Python subprocess模块功能与常见用法实例详解
Jun 28 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
Jul 04 Python
Selenium定时刷新网页的实现代码
Oct 31 Python
Opencv实现抠图背景图替换功能
May 21 Python
Python实现使用request模块下载图片demo示例
May 24 Python
Python算法的时间复杂度和空间复杂度(实例解析)
Nov 19 Python
Python集成开发工具Pycharm的安装和使用详解
Mar 18 Python
Python多个装饰器的调用顺序实例解析
May 22 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
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
JS与C#编码解码
2013/12/03 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
javascript实现留言板功能
2020/02/08 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
python flask安装和命令详解
2019/04/02 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
Python实现动态循环输出文字功能
2020/05/07 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
PHP面试题及答案一
2012/06/18 面试题
营销主管自我评价怎么写
2013/09/19 职场文书
2014年三万活动总结
2014/04/26 职场文书
银行优秀员工推荐信
2015/03/24 职场文书