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入门教程
Feb 08 Python
phpsir 开发 一个检测百度关键字网站排名的python 程序
Sep 17 Python
归纳整理Python中的控制流语句的知识点
Apr 14 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
python使用Plotly绘图工具绘制水平条形图
Mar 25 Python
深入浅析Python 中 is 语法带来的误解
May 07 Python
Python 经典算法100及解析(小结)
Sep 13 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
python实现TCP文件传输
Mar 20 Python
使用Python封装excel操作指南
Jan 29 Python
用Python监控你的朋友都在浏览哪些网站?
May 27 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学习笔记之一
2011/01/17 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
2012/12/07 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
2018/04/20 PHP
JavaScript对象的property属性详解
2014/04/01 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
浅谈node的事件机制
2017/10/09 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
javascript实现获取中文汉字拼音首字母
2020/05/19 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现备份文件实例
2014/09/16 Python
Python程序中的观察者模式结构编写示例
2016/05/27 Python
Python 实现随机数详解及实例代码
2017/04/15 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
如何使用html5与css3完成google涂鸦动画
2012/12/16 HTML / CSS
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
数字漫画:comiXology
2020/06/13 全球购物
零件设计自荐信范文
2013/11/27 职场文书
2014年元旦活动方案
2014/02/15 职场文书
工作决心书范文
2014/03/11 职场文书
行政内勤岗位职责
2014/04/07 职场文书
现场活动策划方案
2014/08/22 职场文书
教师党员自我评价2015
2015/03/04 职场文书
公司出差管理制度范本
2015/08/05 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers