Python利用Pillow(PIL)库实现验证码图片的全过程


Posted in Python onOctober 04, 2020

前言

Pillow库有很多用途,本文使用Pillow来生成随机的验证码图片。

Pillow的用法参考:https://3water.com/article/196007.htm

验证码是随机的,使用Python内置的random库来生成随机的颜色和随机的字符。

random的用法参考:https://3water.com/article/196955.htm

一、验证码图片的效果

# coding=utf-8
import random
from PIL import Image, ImageDraw, ImageFont
 
 
width, height, font_size, font_num = 300, 100, 48, 5
bg_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
image = Image.new(mode='RGB', size=(width, height), color=bg_color)
draw = ImageDraw.Draw(image, mode='RGB')
font = ImageFont.truetype("C:\Windows\Fonts\Arial.ttf", font_size)
verify = str()
for i in range(font_num):
 x = random.randint(i*(width/font_num), (i+1)*(width/font_num)-font_size)
 y = random.randint(0, height-font_size)
 char = random.choice([chr(alpha) for alpha in range(65, 91)] + [str(num) for num in range(10)])
 verify += char
 color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
 draw.text((x, y), char, fill=color, font=font)
print(verify)
image.show()

运行结果:

KG7CQ

Python利用Pillow(PIL)库实现验证码图片的全过程

二、使用的方法介绍

上面的代码已经实现了生成随机验证码的功能,现在介绍代码中用到的函数和方法。

Image.new(): Image模块中的new()函数,创建一张图片(画布),用于绘图。传入3个参数,画布的模式('RGB'表示真彩图片)、尺寸和颜色,画布的颜色就是验证码中的背景颜色。

ImageDraw.Draw(): ImageDraw模块中的Draw()函数,实例化一个ImageDraw类的对象draw,执行绘图。传入两个参数,画布和绘图的模式,画布使用前面Image.new()创建的画布,模式继续使用'RGB'真彩模式。Draw()函数会将传入的两个参数传给ImageDraw类,实例化一个类对象并返回,以便后面使用类对象draw调用对应的方法执行绘图,使用draw对象将验证码中的字符画在画布上。

ImageFont.truetype(): ImageFont模块中的truetype()函数,从字体文件或字体对象中读取字体并返回一个字体对象。传入两个参数,字体文件(或字体对象)和字体大小。字体只能使用当前电脑支持的字体,在Windows系统中,已安装的字体一般都保存在C:\Windows\Fonts文件夹中,如上面代码中的C:\Windows\Fonts\Arial.ttf,应该每个人都默认安装了,在代码中一定要带上扩展名'.ttf',否则读取不到字体文件。如果字体不在Windows\Fonts这个目录下,可以在控制面板找或直接在所有文件中搜索Fonts。字体大小传入一个数字即可。

Python利用Pillow(PIL)库实现验证码图片的全过程

random模块中的randint()和choice()。在上面的代码中,randint()用于随机生成颜色值,随机生成字符在画布上的x和y坐标。choice()用于从26个大写字母(chr字符集中65~90为26个大写字母)和数字中随机选择一个字符。

text(): ImageDraw模块的ImageDraw类的方法,使用ImageDraw.Draw()返回的类对象draw来调用,将字符画到画布上。text()方法有12个参数,并且还可以接收其他的可变参数和关键字参数,不过只有两个必传参数,上面的代码中也只传了4个参数,所以其他的参数就不做介绍了。第一个必传参数是xy,传入一个元组或列表,表示字符画到画布上的位置坐标(字符左上角),第二个必传参数是text,传入一个字符串,表示需要画的字符。上面还传了两个参数fill和font,fill表示字符的颜色,传入一个随机的颜色,font表示字符的字体,传入用ImageFont.truetype()函数返回的字体对象。

循环将每次随机生成的字符绘画到画布上,再使用image对象的show()方法将图片显示出来,随机的验证码图片就生成成功了。

三、优化封装

import random
from PIL import Image, ImageDraw, ImageFont
 
 
def gen_verified_image():
 width, height, font_size, font_num = 400, 150, 48, 4
 bg_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
 image = Image.new(mode='RGB', size=(width, height), color=bg_color)
 draw = ImageDraw.Draw(image, mode='RGB')
 font = ImageFont.truetype("C:\Windows\Fonts\Gadugi.ttf", font_size)
 verify = str()
 for i in range(font_num):
  x = random.randint(i * (width / font_num) + 10, (i + 1) * (width / font_num) - font_size - 10)
  y = random.randint(20, height - font_size - 20)
  char = random.choice([chr(a) for a in range(65, 91)] + [chr(b) for b in range(97, 123)] +
        [str(num) for num in range(10)])
  verify += char
  color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
  draw.text((x, y), char, fill=color, font=font)
 return image, verify
 
 
if __name__ == '__main__':
 image, verify = gen_verified_image()
 print(verify)
 image.show()

运行结果:

qtC7

Python利用Pillow(PIL)库实现验证码图片的全过程

验证码的字体一般不会使用很容易辨认的字体,可以换一个复杂一点的。除了大写字母之外,也可以把小写字母加进来。调整字符的位置避免画到画布的边缘。将代码封装到一个函数中,并将image对象和验证码字符verify作为返回值,方便调用时展示图片和进行验证。

总结

到此这篇关于Python利用Pillow(PIL)库实现验证码图片的文章就介绍到这了,更多相关Python用Pillow(PIL)库验证码图片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
Vue的el-scrollbar实现自定义滚动
May 29 Python
influx+grafana自定义python采集数据和一些坑的总结
Sep 17 Python
python tkinter界面居中显示的方法
Oct 11 Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
python中有关时间日期格式转换问题
Dec 25 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
python实现大战外星人小游戏实例代码
Dec 26 Python
python属于软件吗
Jun 18 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
Python爬虫基础之初次使用scrapy爬虫实例
Jun 26 Python
Python中random模块常用方法的使用教程
Oct 04 #Python
python代数式括号有效性检验示例代码
Oct 04 #Python
关于Python字符编码与二进制不得不说的一些事
Oct 04 #Python
Python实现EM算法实例代码
Oct 04 #Python
python em算法的实现
Oct 03 #Python
浅析Python中字符串的intern机制
Oct 03 #Python
Python实现AES加密,解密的两种方法
Oct 03 #Python
You might like
关于PHP中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
js实现带搜索功能的下拉框实时搜索实时匹配
2013/11/05 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
基于zepto.js实现登录界面
2017/10/09 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
2018/08/04 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
Python多线程实例教程
2014/09/06 Python
Python基于twisted实现简单的web服务器
2014/09/29 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
用python写爬虫简单吗
2020/07/28 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
浙大毕业生自荐信
2014/01/26 职场文书
大学生先进事迹材料
2014/02/16 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
闪闪红星观后感
2015/06/08 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技