Python生成随机验证码
安装PIL模块:
pip3 install pillow
一、基本使用
1、创建图片
from PIL import Image image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255)) # 在图片查看器中打开 # image.show() # 保存在本地 with open("1.png", "wb") as f: image.save(f, format="png")
2、创建画笔,用于在图片上画任意内容
image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255)) draw = ImageDraw.Draw(image, mode="RGB")
3、画点
image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255)) draw = ImageDraw.Draw(image, mode="RGB") # 第一个参数:坐标 # 第二个参数:颜色 draw.point([100, 100], fill="red") draw.point([300, 300], fill=(255, 255, 255))
4、画线
image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255)) draw = ImageDraw.Draw(image, mode="RGB") # 第一个参数:表示起始坐标和结束坐标 # 第二个参数:表示颜色 draw.line((100,100,100,300), fill="red") draw.line((100,100,300,100), fill=(255, 255, 255))
5、画圆
image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255)) draw = ImageDraw.Draw(image, mode="RGB") # 第一个参数:起始坐标和结束坐标(圆要画在其中间) # 第二个参数:开始角度 # 第三个参数:结束角度 # 第四个参数:颜色 draw.arc((100,100,300,300), 0, 90, fill="red")
6. 写文本
image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255)) draw = ImageDraw.Draw(image, mode="RGB") # 第一个参数:起始坐标 # 第二个参数:写入内容 # 第三个参数:颜色 draw.text([0,0], "python", "red")
7、特殊字体文字
image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255)) draw = ImageDraw.Draw(image, mode="RGB") # 第一个参数:字体文件路径 # 第二个参数:字体大小 font = ImageFont.truetype("kumo.ttf", 28) # 第一个参数:起始坐标 # 第二个参数:写入内容 # 第三个参数:颜色 # 第四个参数:字体 draw.text([0, 0], "python", "red", font=font)
字体文件,或者搜索 TrueType 字体文件 下载自己喜欢的字体。
二、图片验证码示例
import random from PIL import Image, ImageDraw, ImageFont def get_random_color(): """获取随机颜色""" return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def get_valid_code(): """生成随机验证码""" image = Image.new("RGB", (136, 36), "rgb(255, 255, 255)") draw = ImageDraw.Draw(image) font = ImageFont.truetype("static/kumo.ttf", size=34) # 生成5个随机字母或数字 valid_list = [] for i in range(1, 6): number = str(random.randint(0, 9)) lower_letter = chr(random.randint(97, 122)) upper_letter = chr(random.randint(65, 90)) random_char = random.choice([number, lower_letter, upper_letter]) draw.text((i*20, 0), random_char, fill="black", font=font) valid_list.append(random_char) width = 136 height = 36 # 画干扰线 for i in range(3): 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=get_random_color()) # 画干扰点 for i in range(100): x = random.randint(0, width) y = random.randint(0, height) draw.point([x, y], fill=get_random_color()) valid_str = "".join(valid_list) # valid_str保存在session中,在登录时用来做验证 # request.session["valid_str"] = valid_str return image, valid_str if __name__ == "__main__": image, code = get_valid_code() # 1、直接打开 image.show() # 2、保存在本地 # with open("code.png", "wb") as f: # image.save(f, format="png") # 3、写入内存(Python3) # import io # stream = io.BytesIO() # image.save(stream, "png") # valid_image = stream.getvalue() # stream.close() # 从内存中获取刚生成的验证码图片,返回给前端 # return HttpResponse(valid_image) # 4、写入内存(Python2) # import StringIO # stream = StringIO.StringIO() # image.save(stream, "png") # stream.getvalue()