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 02 Python
在Linux命令行终端中使用python的简单方法(推荐)
Jan 23 Python
python虚拟环境virtualenv的安装与使用
Sep 21 Python
python简易远程控制单线程版
Jun 20 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
利用Python+阿里云实现DDNS动态域名解析的方法
Apr 01 Python
Apache部署Django项目图文详解
Jul 30 Python
Python序列化与反序列化pickle用法实例
Nov 11 Python
django queryset 去重 .distinct()说明
May 19 Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 Python
解决keras模型保存h5文件提示无此目录问题
Jul 01 Python
Python Pandas模块实现数据的统计分析的方法
Jun 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 中文字符入库或显示乱码问题的解决方法
2010/04/12 PHP
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
分享PHP守护进程类
2015/12/30 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
javascript实现拖放效果
2015/12/16 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
vue-router 路由基础的详解
2017/10/17 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
js验证账户名是否重复
2020/05/26 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
[36:13]Mineski vs iG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
python搭建微信公众平台
2016/02/09 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
创建Django项目图文实例详解
2019/06/06 Python
python导入pandas具体步骤方法
2019/06/23 Python
Python中字符串List按照长度排序
2019/07/01 Python
python实现机器人卡牌
2019/10/06 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
购买原创艺术品:Zatista
2019/11/09 全球购物
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
自我鉴定怎么写
2013/12/05 职场文书
高二美术教学反思
2014/01/14 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
dubbo服务整合zipkin详解
2021/07/26 Java/Android