Python利用Pillow(PIL)库实现验证码图片的全过程
作者:Python碎片 发布时间:2022-05-18 21:27:47
前言
Pillow库有很多用途,本文使用Pillow来生成随机的验证码图片。
Pillow的用法参考:https://www.jb51.net/article/196007.htm
验证码是随机的,使用Python内置的random库来生成随机的颜色和随机的字符。
random的用法参考:https://www.jb51.net/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
二、使用的方法介绍
上面的代码已经实现了生成随机验证码的功能,现在介绍代码中用到的函数和方法。
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。字体大小传入一个数字即可。
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
验证码的字体一般不会使用很容易辨认的字体,可以换一个复杂一点的。除了大写字母之外,也可以把小写字母加进来。调整字符的位置避免画到画布的边缘。将代码封装到一个函数中,并将image对象和验证码字符verify作为返回值,方便调用时展示图片和进行验证。
来源:https://blog.csdn.net/weixin_43790276/article/details/108806077
猜你喜欢
- /** * 返回一个随机的小写字母 */ function getLowerCharacter(){ return getCharacter
- PHP中主要用strtr()和str_repalce()这两个函数替换字符串和数组,但你们都知道他们这两个函数的区别和用法吗?有不少文章在说
- 1. 二维(多维)数组降为一维数组方法1: reshape()+concatenate 函数,这个方法是间接法,利用 reshape() 函
- 目前很多网站都使用ajax技术动态加载数据,和常规的网站不一样,数据时动态加载的,如果我们使用常规的方法爬取网页,得到的只是一堆html代码
- 本文实例讲述了JavaScript 扩展运算符用法。分享给大家供大家参考,具体如下:扩展运算符格式扩展运算符格式很简单,就是三个点(…)重点
- 1、首先,界面上有个按钮触发操作:<button type="button" class="layui-
- 推荐使用 Homebrew 来安装第三方工具。自己安装的python散落在电脑各处,删除起来比较麻烦。今天在此记录一下删除的过程(本人以Py
- MySQL ALTER语法如下:ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec
- 导语《我的世界》是一款自由度极高的游戏,每个新存档的开启,就像是作为造物主的玩家在虚拟空间开辟了一个全新的宇宙。方块连接世界,云游大好河山。
- 首先先安装好我们的Python 这里就不多介绍了1.打开python.exe:点击File 下的小扳手图标 Settings…2.打开设置界
- 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流!为了保证在业务高峰期,线上系统也能保证一定的弹性和稳定性,最有效的方案就是进行服
- 游标为您提供了在逐行的基础上而不是一次处理整个结果集为基础的操作表中数据的方法。 1.如何使用游标 1)定义游标语句 Declare <
- 摘要:本文介绍HetuEngine实现On Yarn的原理,通过阅读本文,读者可以了解HetuEngine如何在资源使用方面融入Hadoop
- 函数 &n
- 开发背景是这样的:整个项目中使用很多台摩托罗拉的RFID读卡器,我要为这些读卡器写一个管理程序,判断是否有RFID标签进入或离开某个区域。用
- 本文实例讲述了Python实现简单的文本相似度分析操作。分享给大家供大家参考,具体如下:学习目标:1.利用gensim包分析文档相似度2.使
- 在SQL查询中,关键词Like可提供模糊查询功能,它通常与通配符一起使用。1 Like条件适用数据库字段类型 &nbs
- 使用Python过程中,经常需要对文件和目录进行操作。所有file类/os/os.path/shutil模块时每个Python程序员必须学习
- 为最终用户提供的功能主要由一个HTML文件和两个ASP文件提供,它们负责接受用户的订阅申请以及退出邮件列表申请。 用户的个人信息在图1所示的
- 本文实例讲述了python自动化之Ansible的安装。分享给大家供大家参考,具体如下:一 点睛Ansible只需在管理端部署环境即可,建议