验证码
Python生成随机验证码,需要使用PIL模块.
安装:
|
1
|
pip3 install pillow |
基本使用
1. 创建图片
|
1
2
3
4
5
6
7
8
9
|
from PIL import Imageimg = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))# 在图片查看器中打开# img.show() # 保存在本地with open('code.png','wb') as f: img.save(f,format='png') |
2. 创建画笔,用于在图片上画任意内容
|
1
2
|
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))draw = ImageDraw.Draw(img, mode='RGB') |
3. 画点
|
1
2
3
4
5
6
|
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))draw = ImageDraw.Draw(img, mode='RGB')# 第一个参数:表示坐标# 第二个参数:表示颜色draw.point([100, 100], fill="red")draw.point([300, 300], fill=(255, 255, 255)) |
4. 画线
|
1
2
3
4
5
6
|
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))draw = ImageDraw.Draw(img, mode='RGB')# 第一个参数:表示起始坐标和结束坐标# 第二个参数:表示颜色draw.line((100,100,100,300), fill='red')draw.line((100,100,300,100), fill=(255, 255, 255)) |
5. 画圆
|
1
2
3
4
5
6
7
|
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))draw = ImageDraw.Draw(img, mode='RGB')# 第一个参数:表示起始坐标和结束坐标(圆要画在其中间)# 第二个参数:表示开始角度# 第三个参数:表示结束角度# 第四个参数:表示颜色draw.arc((100,100,300,300),0,90,fill="red") |
6. 写文本
|
1
2
3
4
5
6
|
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))draw = ImageDraw.Draw(img, mode='RGB')# 第一个参数:表示起始坐标# 第二个参数:表示写入内容# 第三个参数:表示颜色draw.text([0,0],'python',"red") |
7. 特殊字体文字
|
1
2
3
4
5
6
7
8
9
10
|
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))draw = ImageDraw.Draw(img, mode='RGB')# 第一个参数:表示字体文件路径# 第二个参数:表示字体大小font = ImageFont.truetype("kumo.ttf", 28)# 第一个参数:表示起始坐标# 第二个参数:表示写入内容# 第三个参数:表示颜色# 第四个参数:表示颜色draw.text([0, 0], 'python', "red", font=font) |
图片验证码
import random def check_code(width=120, height=30, char_length=5, 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)) 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(40): draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor()) # 写干扰圆圈 for i in range(40): 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(5): 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) return img,''.join(code) if __name__ == '__main__': # 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()
应用:
1 def check_code(request): 2 #读取硬盘中的文件,在页面显示 3 # f=open('static/img/flower.jpg','rb') 4 # data=f.read() 5 # f.close() 6 # return HttpResponse(data) 7 8 #创建图片,保存在本地,再读出来渲染 9 # from PIL import Image 10 # f=open('code.png','wb') 11 # img=Image.new(mode='RGB',size=(120,30),color=(0,255,255)) 12 # img.save(f,'png') 13 # 14 # f=open('code.png','rb') 15 # data=f.read() 16 # f.close() 17 # return HttpResponse(data) 18 19 #创建图片,可以在上面画点,线,圆,写字,保存在内存中,直接读到页面进行渲染 20 # from PIL import Image,ImageDraw,ImageFont 21 # from io import BytesIO 22 # 23 # f=BytesIO() 24 # img=Image.new(mode='RGB',size=(120,30),color=(255,255,255)) 25 # draw=ImageDraw.Draw(img,mode='RGB') 26 # draw.point([10,10],fill='red') 27 # draw.line((15,10,50,50),fill=(0,255,0)) 28 # draw.arc((0,0,30,30),0,360,fill='red') 29 # 30 # 31 # font=ImageFont.truetype('static/font/domi.ttf',28) 32 # draw.text([0, 0], 'python', 'red',font=font) 33 # img.save(f,'png') 34 # return HttpResponse(f.getvalue()) 35 36 #生成随机字符串 37 # import random 38 # char_list=[] 39 # for i in range(5): 40 # char=chr(random.randint(65,90)) 41 # char_list.append(char) 42 # font=ImageFont.truetype('static/font/domi.ttf',28) 43 # draw.text((i*24,0),char,(random.randint(0,255),random.randint(0,255),random.randint(0,255)),font=font) 44 # img.save(f,'png') 45 # data=f.getvalue() 46 # code=''.join(char_list) 47 # request.session['code']=code 48 # return HttpResponse(data) 49 50 51 #引入验证码模块 52 from io import BytesIO 53 img,code=rd_check_code() 54 stream=BytesIO() 55 img.save(stream,'png') 56 request.session['code']=code 57 return HttpResponse(stream.getvalue())

浙公网安备 33010602011771号