Python进阶之pillow模块绘制验证码
Walter Lv1

简介

PIL:Python Imaging Library,是一个强大的图像处理标准库,Pillow 是由 Python2.x 版本中PIL的基础上延伸来的更加兼容的版本。

Pillow 模块主要提供了图像处理的功能,可以处理图像、做图像缩放、旋转、翻转、裁剪、调整亮度与对比度等操作,支持多种图像格式,支持图像的滤镜处理,支持高级图像处理,支持图片编码和解码,支持图像和文本的混合输出,支持多平台,可派生到多种语言。

安装和导入

安装Pillow模块:

pip install pillow

导入Pillow:

from PIL import xxx

快速上手

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from PIL import Image, ImageDraw, ImageFont, ImageFilter
# 画板
img = Image.new(mode='RGB', size=(120, 30), color=(188, 188, 188))
# 画笔
draw = ImageDraw.Draw(img, mode='RGB')
# 使用自定义字体
font_size = 28
font = ImageFont.truetype('app01/static/font/Keyboard.ttf', font_size)

# 绘制文本内容,list内为绘制坐标[x, y]
draw.text([0,0], 'hello,world!', fill='red')
# 绘制像素点,list中为像素点坐标
draw.point([100, 10], fill='black')
# 绘制圆弧,tuple中为边框两角的左边,也可以写成([0, 0],[30, 20]),start=0,end=360,表示开始和结束的角度
draw.arc((0, 0, 30, 20), 0, 360, fill="green")
# 绘制直线tuple中为端点坐标,(x1, y1, x1, y2)
draw.line((0, 0, 120, 30), fill='blue')

** **image

实战

日常Web 开发过程中,在注册及登录验证时,数字验证码使用场景颇多。虽然得益于 Django 强大的第三方库如:

  • django-simple-captcha:支持生成简单的文字验证码和数学验证码,支持中文。
  • django-captcha:支持生成简单的文字验证码,支持自定义字体大小、字体类型等。
  • django-recaptcha:基于Google reCAPTCHA,支持验证码和滑动验证码,支持多种语言。
  • django-simple-captcha-update:支持生成简单的文字验证码,支持中文,支持自定义字体大小等。

但通过 Pillow 模块我们自己也能实现简单的数字验证码功能。

演示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter


def check_code(width=120, height=30, char_length=4, font_file='app01/static/font/Keyboard.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:
"""
# 由ascii码随机生成大小写字母
ascii_list = list(range(65, 91)) + list(range(97, 123))
# 使用map ASCII 码映射为字符格式
letter_list = list(map(chr, ascii_list))
return random.choice(letter_list)

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(-3, 0)
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(30):
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 5, y + 5), 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)

效果预览

image

根据个人需求还可以增加随机字体大小,模糊背景等功能,更多使用方法参考Pillow 官方文档

 评论