python 生成验证码图片
来自 《Python项目案例开发从入门到实战》(清华大学出版社 郑秋生 夏敏捷主编)中图像处理——生成二维码和验证码
1 import random
2 import string
3 from PIL import Image, ImageDraw, ImageFont, ImageFilter
4
5
6 # 用来随机生成一个字符串
7 def gene_text(number):
8 # 生成52个大小写英文字母
9 source = list(string.ascii_letters)
10 # 添加上数字
11 for index in range(0, 10):
12 source.append(str(index))
13 return ''.join(random.sample(source, number)) # number是生成验证码的位数
14
15
16 # 用来绘制干扰线
17 def gene_line(draw, width, height, linecolor):
18 # random.randint(a, b)用于生成一个指定范围内的证书,其中第一个参数a是上限,第二个参数b是下限,生成的随机数n:a<=n<=b
19 begin = (random.randint(0, width), random.randint(0, height))
20 end = (random.randint(0, width), random.randint(0, height))
21 # 在图像上画线,参数值为线的起始和终止位置坐标[(x, y), (x, y)]和线的填充颜色
22 draw.line([begin, end], fill=linecolor)
23
24
25 # 生成验证码
26 def gene_code(size, bgcolor, font_path, number, draw_line, fontcolor):
27 # 宽和高
28 width, height = size
29 # 创建图片, 'RGBA'表示4*8位像素,真彩+透明通道
30 image = Image.new('RGBA', (width, height), bgcolor)
31 # 验证码的字体。ImageFont这个函数从指定的文件加载了一个字体对象,并且为指定大小的字体创建了字体对象。
32 font = ImageFont.truetype(font_path, 25)
33 # 创建画笔,创建可用于绘制给定图像的对象
34 draw = ImageDraw.Draw(image)
35 # 随机生成想要的字符串
36 text = gene_text(number)
37 # 返回给定文本的宽度和高度,返回值为2元组
38 font_width, font_height = font.getsize(text)
39 # 填充字符串,参数分别是:文本的左上角坐标,文本内容,字体,文本的填充颜色
40 draw.text(((width-font_width)/number, (height-font_height)/number), text, font=font, fill=fontcolor)
41
42 if draw_line:
43 # 计算要画的线的条数
44 line_count = random.randint(line_number[0], line_number[1])
45 print('line_count = ', line_count)
46 for i in range(line_count):
47 gene_line(draw, width, height, linecolor)
48 # 创建扭曲,transform(size, method, data) 其中第一个参数是尺寸大小, Image.AFFINE表示仿射变化
49 # 第三个参数是转换方法的额外数据, Image.BILINEAR是线性插值法
50 image = image.transform((width+20, height+10), Image.AFFINE, (1, -0.3, 0, -0.1, 1, 0), Image.BILINEAR)
51 # 滤镜,边界加强,ImageFilter.EDGE_ENHANCE_MORE为深度边缘增强滤波,会使得图像中边缘部分更加明显。
52 image = image.filter(ImageFilter.EDGE_ENHANCE_MORE)
53 # 保存验证码图片
54 image.save('idencode.png')
55
56
57 if __name__ == "__main__":
58 # 字体的位置
59 font_path = 'FangZhengFangSongJianTi-1.ttf'
60 # 生成几位数的验证码
61 number = 4
62 # 生成验证码图片的高度和宽度
63 size = (80, 30)
64 # 背景颜色,默认为白色
65 bgcolor = (255, 255, 255)
66 # 字体颜色,默认为蓝色
67 fontcolor = (0, 0, 255)
68 # 干扰线颜色,默认为红色
69 linecolor = (255, 0, 0)
70 # 是否加入干扰线
71 draw_line = True
72 # 假如干扰线条数的上/下限
73 line_number = (1, 5)
74 # 调用生成验证码diamante
75 gene_code(size, bgcolor, font_path, number, draw_line, fontcolor)
其中字体下载的是方正仿宋简体
结果图: