验证码生成
程序员文章站
2022-05-13 15:55:35
...
提示:
windows查看系统字体位置:win + r
:打开命令窗口
输入:fonts
即可找到
linux下字体文件夹位置,任意选择一个字体文件(以 .ttf
作为后缀的文件)
下面freefont
这是系统自带免费字体文件夹,也可以自己下载喜欢的字体存放在/usr/share/fonts/truetype
这个路径下方便调用
/usr/share/fonts/truetype/freefont
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
import math, string
# 字体的位置,不同版本的系统会有不同
font_path = 'C:\Windows\Fonts\Arial.ttf'
# font_path = '/Library/Fonts/Hanzipen.ttc'
# 生成几位数的验证码
number = 4
# 生成验证码图片的高度和宽度
size = (100, 30)
# 背景颜色,默认为白色
bgcolor = (255, 255, 255)
# 字体颜色,默认为蓝色
fontcolor = (0, 0, 255)
# 干扰线颜色。默认为红色
linecolor = (255, 0, 0)
# 是否要加入干扰线
draw_line = True
# 加入干扰线条数的上下限
line_number = (1, 5)
def gen_text():
source = list(string.ascii_letters)
for index in range(0,10):
source.append(str(index))
return ''.join(random.sample(source, number)) # number是生成验证码的位数
# 用来绘制干扰线
def gene_line(draw, width, height):
begin = (random.randint(0, width), random.randint(0, height))
end = (random.randint(0, width), random.randint(0, height))
draw.line([begin, end], fill=linecolor)
def gene_code(save_path,filename):
width, height = size # 宽和高
image = Image.new('RGBA', (width, height), bgcolor) # 创建图片
font = ImageFont.truetype(font_path, 25) # 验证码的字体和字体大小
# font = ImageFont.truetype(25) #验证码的字体和字体大小
draw = ImageDraw.Draw(image) # 创建画笔
# text = "我是中国人" # 生成字符串
text = gen_text() # 生成字符串
print(text)
font_width, font_height = font.getsize(text)
draw.text(((width - font_width) / number, (height - font_height) / number),
text, font=font, fill=fontcolor) # 填充字符串
if draw_line:
gene_line(draw, width, height)
gene_line(draw, width, height)
gene_line(draw, width, height)
gene_line(draw, width, height)
image = image.transform((width + 20, height +10), Image.AFFINE, (1, -0.3, 0, -0.1, 1, 0), Image.BILINEAR) # 创建扭曲
image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强
image.save('%s/%s.png' % (save_path, filename)) # 保存验证码图片
return text
if __name__ == "__main__":
gene_code('./img', 'test') # 会把生成的图片保存在当前img文件夹下/img/test.png
上一篇: 5.4技术补充——反射机制
下一篇: 链表内容的补充2:静态链表