django_project_demo/app/utils/code.py
2024-08-24 03:25:23 +00:00

87 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Python生成随机验证码需要使用PIL模块.
参考资料https://www.cnblogs.com/wupeiqi/articles/5812291.
要用到字体文件 ,和本文件放到一个目录下
pip3 install pillow
"""
import random
from PIL import Image, ImageDraw, ImageFont,ImageFilter
def check_code(width=120, height=50, char_length=4, font_file='kumo.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:
"""
# return chr(random.randint(65, 90))
return str(random.randint(0,9))
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(0, 4)
draw.text([i * width / char_length, h], char, font=font, fill=rndColor())
# # 写干扰点
# for i in range(1):
# draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
#
# # 写干扰圆圈
# for i in range(1):
# draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
# x = random.randint(0, width)
# y = random.randint(0, height)
# draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())
# 画干扰线
# for i in range(1):
# 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)
# 返回两个参数img是图片,code是生成的字符
return img, ''.join(code)
#
# if __name__ == '__main__':
# img, code_str = check_code()
# print(code_str)
# # 1. 直接打开
# # img,code = check_code()
# img.show()
#
# # 2. 写入文件
# # img,code = check_code()
# # with open('code.png','wb') as f:
# # img.save(f,format='png')
#
# # 3. 写入内存(Python3)
# # from io import BytesIO
# # stream = BytesIO()
# # img.save(stream, 'png')
# # stream.getvalue()
#
# # 4. 写入内存Python2
# # import StringIO
# # stream = StringIO.StringIO()
# # img.save(stream, 'png')
# # stream.getvalue()