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 相关文章推荐
在Windows8上的搭建Python和Django环境
Jul 03 Python
python验证码识别的示例代码
Sep 21 Python
python实现简单tftp(基于udp协议)
Jul 30 Python
Python SQL查询并生成json文件操作示例
Aug 17 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
对pyqt5之menu和action的使用详解
Jun 20 Python
Django urls.py重构及参数传递详解
Jul 23 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
django 利用Q对象与F对象进行查询的实现
May 15 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 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+mysql)
2007/11/23 PHP
phpMyAdmin 安装及问题总结
2009/05/28 PHP
php函数的常用方法及注意之处小结
2011/07/10 PHP
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
使用JS正则表达式 替换括号,尖括号等
2016/11/29 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
详解vue-cli3使用
2018/08/14 Javascript
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
Python 学习教程之networkx
2019/04/15 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
财务会计专业应届毕业生求职信
2013/10/18 职场文书
医药销售自我评价200字
2014/09/11 职场文书
国际残疾人日广播稿范文
2014/10/09 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
亮剑观后感300字
2015/06/05 职场文书
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android