生成随机验证码图片

来源:互联网 发布:哪个牌子的网络电视好 编辑:程序博客网 时间:2024/06/06 16:54
  • 安装 PIL模块

    • pip3 install pillow
  • 生成 图片

from PIL import Imageimg = Image.new(mode='RGB',size=(120,30),color=(0,255,255))# 查看 图片# img.show()# 保存 图片 到本地with open('code.png','wb') as f:    img.save(f,format='png')
  • 创建画笔,在图片上画内容
from PIL import Image,ImageDrawimg = Image.new(mode='RGB',size=(120,30),color=(0,255,255))draw = ImageDraw.Draw(img,mode='RGB')# 画点draw.point([100,10],fill='red')draw.point([100, 20], fill='red')draw.point([100, 25], fill='red')# 画线draw.line((10,10,100,20),fill=(255,0,255))# 画圆draw.arc((0,0,30,20),0,360,fill='red')# 写文字draw.text([0,0],'python','red') # 加入特殊字体from PIL import ImageFontfont = ImageFont.truetype('kumo.ttf',28)draw.text([0,0],'python','red',font=font) 
  • 上面 是把生成写入本地 这种方法是不好的,应该把这个图片写入到内存里
from PIL import Image,ImageDraw,ImageFontfrom io import BytesIOf = BytesIO()img = Image.new(mode='RGB',size=(120,30),color=(0,255,255))draw = ImageDraw.Draw(img,mode='RGB')# .......img.save(f,'png')# 取图片data = f.getvalue()
  • 生成随机验证码图片
# views.pydef check_code(request):    from io import BytesIO    from utils.random_check_code import rd_check_code    img,code = rd_check_code()    stream = BytesIO()    img.save(stream,'png')    request.session['code'] = code    return HttpResponse(stream.getvalue())# random_check_code.pyfrom PIL import Image,ImageDraw,ImageFont,ImageFilterimport randomdef rd_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)
原创粉丝点击