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 11 Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
用python实现k近邻算法的示例代码
Sep 06 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 Python
解决python3中cv2读取中文路径的问题
Dec 05 Python
详解程序意外中断自动重启shell脚本(以Python为例)
Jul 26 Python
Python中的四种交换数值的方法解析
Nov 18 Python
wxPython色环电阻计算器
Nov 18 Python
Python实现一个简单的递归下降分析器
Aug 01 Python
教你用python实现一个无界面的小型图书管理系统
May 21 Python
Python编程编写完善的命令行工具
Sep 15 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录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
详解PHP队列的实现
2019/03/14 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
解析window.open的使用方法总结
2013/06/19 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
详细总结Javascript中的焦点管理
2016/09/17 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
创业计划书的内容步骤和要领
2014/01/04 职场文书
小学毕业感言50字
2014/02/16 职场文书
生物科学专业自荐书
2014/06/20 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
红色电影观后感
2015/06/18 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python
Python实现8种常用抽样方法
2021/06/27 Python
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server
关于python中模块和重载的问题
2021/11/02 Python