python 生成验证码图片(python generate captCHA images)

 

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)

其中字体下载的是方正仿宋简体

结果图:

原文地址:https://www.cnblogs.com/ttweixiao-IT-program/p/13528427.html