zoukankan      html  css  js  c++  java
  • 简单的验证码制作

    参考链接:https://www.jianshu.com/p/9e44acf19513

    最终结果:

    定义一个类:

    1.通过随机数,利用ASCII码来获取到相对应的字符。

    def random_char(self):
        num = random.randint(1, 3)
        if num == 1:
            # 随机一个0-9之间数字: ascii码
            char = random.randint(48, 57)
        elif num == 2:
            # 随机一个a-z之间字母
            char = random.randint(97, 122)
        else:
            # 随机一个A-Z之间字母
            char = random.randint(65, 90)
        return chr(char)

    2.通过图片中的效果,可以看出有一些干扰字符, 比如_ , -等一些字符。

    def random_diss(self):
        arr = ["^", "_", "-", ".", "~"]
        return arr[random.randint(0, len(arr) - 1)]

     3.纵观图片颜色,小黑点是一种颜色区间,字体颜色和干扰字符是另一种颜色。

     # 定义干扰字符颜色,干扰字符与字符颜色在不同区间
        def random_char_color(self):
            return (random.randint(65, 255),
                       random.randint(65, 255),
                       random.randint(65, 255))
    
        # 定义字符颜色, 三原色 RGB
        def random_diss_color(self):
            return (random.randint(32, 127),
                       random.randint(32, 127),
                       random.randint(32, 127))

    定义一个函数,来生成验证码

        # 生成验证码:
        def create_captcha(self):
            width = 240  # 240px
            height = 60  # 60px
    
            # 创建一个图片 new(mode, size, color=0):
            image = Image.new("RGB", (width, height), (192, 192, 192))
    
            # 创建font对象,定义字体和大小
            # font_name = random.randint(1, 3)
            # font_file = os.path.join(
            #     os.path.dirname(__file__),
            #     "static/fonts") + "/%d.ttf" % font_name
            # font = ImageFont.truetype(font_file, 40)
            # 在window中运行,由于字体是存放在C:WindowsFonts下面
            font = ImageFont.truetype(r'C:WindowsFontsArial.ttf', 40)
    
            # 创建draw画布使图片可编辑,填充像素点
            draw = ImageDraw.Draw(image)
            for x in range(0, width, 5):
                for y in range(0, height, 5):
                    draw.point((x, y), fill=self.random_diss_color())
    
            # 填充干扰字符
            for v in range(0, width, 30):
                dis = self.random_diss()
                w = 5 + v
                # 距离图片上边距最多15个像素, 最低五个像素
                h = random.randint(5, 15)
                draw.text((w, h), dis, font=font, fill=self.random_diss_color())
            # 填充字符
            chars = ""
            for v in range(4):
                c = self.random_char()
                chars += str(c)
                # 距离图片上边距最多15个像素, 最低五个像素
                h = random.randint(5, 15)
                # 占图片宽度1/4, 10px间距, 顺序平移
                w = width / 4 * v + 10
                draw.text((w, h), c, font=font, fill=self.random_char_color())
            # 模糊效果:
            image.filter(ImageFilter.BLUR)
            # uuid4()——基于随机数: 由伪随机数得到,有一定的重复概率,该概率可以计算出来。
            # unid.hex 表示以32个字符表示的UUID
            image_name = "%s.jpg" % uuid.uuid4().hex
            save_dir = os.path.join(
                os.path.dirname(__file__),
                "static/captcha")
            # 当路径不存在时自动创建
            if not os.path.exists(save_dir):
                os.makedirs(save_dir)
            image.save(save_dir + '/' + image_name, "jpeg")
            return dict(
                image_name=image_name,
                captcha=chars
            )
            image.show()    
  • 相关阅读:
    hdu6314 容斥+数学
    后缀数组+指针
    F. Dominant Indices
    牛客网挑战赛19 B,C,F
    拓展欧几里得理论基础(含一定证明)
    数字
    vue的自定义树形列表组件(及数据格式转换)
    Activiti实现会签功能
    7种单例模式
    MySQL中数据类型(char(n)、varchar(n)、nchar(n)、nvarchar(n)的区别)(转)
  • 原文地址:https://www.cnblogs.com/zengsf/p/9982662.html
Copyright © 2011-2022 走看看