zoukankan      html  css  js  c++  java
  • 利用 PIL模块实现生成动态验证码

    简单说下需求:

    当用户点击动态框时,实现实时更换动态库里的数字更换

    模块: PIL  io

    前端页面:

    <img src="/get_code/" alt="" id="id_img" width="260" height="35">

    <script>
    $('#id_img').click(function () {
    let old_path = $('#id_img').attr('src');
    $(this).attr('src', old_path += '?')
    });
    </script>



    路由层:
    url(r'^get_code/',views.get_code)


    视图层
    # PIl模块可以实现动态生成图像
    from PIL import Image, ImageDraw, ImageFont, ImageFilter
    
    #Image 生成图片
    #ImageDraw 在图片上写字
    #ImageFont  控制字体样式
    
    
    from io import BytesIO  #保存数据,并且在取的时候会以字节的形式返回,,StringIo 字符串形式返回
    
    
    #图片颜色动态变化,图片存放不依赖与文件的形式
    def get_code(request):
        # img_obj = Image.new('RGB',(260,35),get_random())
        # #生成一个BytesIo对象
        # io_obj = BytesIO()  #将这个对象看成文件句柄
        # img_obj.save(io_obj,'png')  # 将图片数据存入内存管理器中  需要指定图片格式
        # return HttpResponse(io_obj.getvalue())  # 将保存的数据以二进制的数据返回出来
    
        img_obj = Image.new('RGB',(260,35),get_random())
        #生成一个画笔对象
        img_draw = ImageDraw.Draw(img_obj)  #拿着画笔就可以在图片上为所欲为
        #生成字体样式
        img_font = ImageFont.truetype('static/font/11.ttf',30)  #30为字体大小
    
        #随即验证码  数字+大小写字母
        code = ''  #定义一个变量存储验证码
        for i in range(5):
            random_int = str(random.randint(0,9))
            random_lower = chr(random.randint(97,122))
            random_upper = chr(random.randint(65,90))
            temp_code = random.choice([random_int,random_lower,random_upper])   # 在生成的当个验证码中随即一个
            #将产生的字一个一个的写在图片上
            img_draw.text((60+i*30, 0),temp_code,get_random(),img_font)
       # code 记录
            code += temp_code
        print(code)
    
        #考虑到需要比对验证码,选择将code存放到session表里
        request.session['code'] = code
    
        #生成io对象
        io_obj = BytesIO()
    
        #可以将字体 改的模糊一些  可选项
        img_obj = img_obj.filter(ImageFilter.BLUR)
    
    
        img_obj.save(io_obj,'png')
        return HttpResponse(io_obj.getvalue())
    #生成颜色构成三原色数字 import random def get_random(): return random.randint(0,255),random.randint(0,255),random.randint(0,255)

      

    整理版:
    def get_random():
        return random.randint(0,255),random.randint(0,255),random.randint(0,255)
    
    
    
    def get_code(request):
        img_obj = Image.new('RGB',(260,35),get_random())  # 生成图像对象
        img_draw = ImageDraw.Draw(img_obj)  # 生成画笔对象
        img_font = ImageFont.truetype('static/font/1.ttf',30)  #生成字体对象
        code = ''        #用来保存生成的随机码 
        for i in range(6):
            random_int = str(random.randint(0,9))
            random_lower = chr(random.randint(97,122))
            random_upper = chr(random.randint(65,90))
            temp_code = random.choice([random_int,random_lower,random_upper])
            code += temp_code
            img_draw.text((60+i*30,0),temp_code,get_random(),img_font)  # 指定xy,数据,颜色的样式,字体样式
        # print(code)
        request.session['code'] = code  # 作为session保存,用来验证前端传过来的随机码
        io_obj = BytesIO()  # 保存数据做准备,生成一个io对象,并且在取的时候会以字节的形式返回
        img_obj = img_obj.filter(ImageFilter.BLUR)    # 将字体改的模糊一些
        img_obj.save(io_obj,'png')        # 保存数据,需要指定图片格式
        return HttpResponse(io_obj.getvalue())   # 固定格式,取值返回给前端页面
    

      






  • 相关阅读:
    http://www.oschina.net/translate/elasticsearch-getting-started?cmp
    http://www.mxchip.com/talk/news/jishuwenzhang/2014-09-11/67.html
    深入理解JVM—性能监控工具
    Windows7查看本地Java安装是否成功和路径的方法
    Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案
    PSYoungGen /PSOldGen/PSPermGen区别
    深入浅出Java并发包—锁机制(三)
    深入浅出Java并发包—锁机制(二)
    【转】Spring 注解学习手札(超好的springmvc注解教程)
    解决java.lang.NoClassDefFoundError: org.jdom.Content
  • 原文地址:https://www.cnblogs.com/changwenjun-666/p/11061355.html
Copyright © 2011-2022 走看看