首页 > 编程语言 >Python生成随机验证码

Python生成随机验证码

时间:2024-05-23 22:19:58浏览次数:22  
标签:randint Python random 验证码 width 随机 图像 font 255

import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter


def check_code(width=120, height=30, char_length=5, font_file='Monaco.ttf', font_size=28):
    code = []
    """
        Image.new 方法用于创建一个新的图像对象。
        mode='RGB' 指定图像模式为RGB,即红、绿、蓝三原色。
        size=(width, height) 指定图像的尺寸。
        color=(255, 255, 255) 指定图像的背景颜色为白色(RGB值为255, 255, 255)。

        ImageDraw.Draw对象用于在图像上绘制各种形状和文本。

        ImageFont.truetype(font_file, font_size) 方法加载自定义字体文件。
    """
    img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))

    draw = ImageDraw.Draw(img, mode='RGB')

    # 生成一个随机的大写字母(A-Z)
    def random_char():
        """
        生成随机字母
        :return:
        """
        return chr(random.randint(65, 90))

    # 生成一个随机颜色
    def random_color():
        """
        生成随机颜色
        :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 = random_char()
        code.append(char)
        h = random.randint(0, 4)
        draw.text([i * width / char_length, h], char, font=font, fill=random_color())
        """
        draw.text()在图像上绘制字符,
            xy:文本的坐标(元组或列表),指定文本的左上角位置。
            text:要绘制的文本字符串。
            fill:文本的颜色(RGB元组)。
            font:字体对象(ImageFont.truetype 返回的对象),指定文本的字体和大小。
            
        字符的位置由 [i * width / char_length, h] 确定,
            其中 i * width / char_length 确保字符按宽度均匀分布,h 是字符的高度偏移量,char 是要绘制的字符,
        font 是之前加载的字体,
        fill 是字符的颜色,由 random_color 函数生成。
        """

    # 绘制干扰点
    for i in range(40):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
        """
        draw.point() 方法在 PIL(Pillow)库中用于在图像上绘制单个像素点
            xy:点的位置,通常是一个 (x, y) 坐标的元组或列表。
            fill:点的颜色,可以是 RGB 或 RGBA 的元组。
            
        random.randint(0, width):生成一个从0到图像宽度 width 之间的随机整数,作为点的横坐标。
        random.randint(0, height):生成一个从0到图像高度 height 之间的随机整数,作为点的纵坐标。
        这两个函数组合起来生成一个随机位置 (x, y),在图像的范围内。
        """

    # 绘制干扰圆弧
    for i in range(40):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw.arc((x, y, x + 4, y + 4), 0, 90, fill=random_color())
        """
        draw.arc() 方法在图像上绘制一个圆弧
            (x, y, x + 4, y + 4):定义了圆弧的边界框,即左上角和右下角的坐标。
            0 和 90:分别是圆弧的起始角度和结束角度(单位为度),在这里是从0度到90度,即绘制一个四分之一圆。
        """

    # 绘制干扰线
    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=random_color())
        """
        draw.line() 方法在图像上绘制一条直线
            (x1, y1, x2, y2):定义了直线的起始点 (x1, y1) 和结束点 (x2, y2) 的坐标。
        """

    # 应用滤镜:
    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
    """
    img.filter():这是 PIL 库中的一个方法,用于对图像应用滤波器。
    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()

标签:randint,Python,random,验证码,width,随机,图像,font,255
From: https://www.cnblogs.com/colinannualsalary100w/p/18209475

相关文章

  • 01-Python 图片转字符画
    fromPILimportImage"""将图片转换为字符画图片转字符画是将一张图片转换成由字符组成的图像,通常用于在命令行界面或者文本编辑器中显示。这个过程主要包括以下几个步骤:-读取图片文件-将图片转换为灰度图像-调整图片的尺寸以适应字符画的宽度......
  • 给大家分享一套非常棒的python机器学习课程
    给大家分享一套非常棒的python机器学习课程——《AI小天才:让小学生轻松掌握机器学习》,2024年5月完结新课,提供配套的代码+笔记+软件包下载!学完本课程,可以轻松掌握机器学习的全面应用,复杂特征工程,数据回归,分类,算法的项目实战应用,以小学生的视角和知识储备即可学会。课程名字:AI小天才......
  • Python多线程案例分析
    接下来,我们将在之前的基础上进一步扩展多线程爬虫案例,增加以下功能:1.动态URL发现与添加:爬虫在解析页面时,能够发现并添加新的URL到队列中。2.设置请求头:模拟浏览器行为,设置请求头中的`User-Agent`。3.使用会话:使用`requests.Session()`对象来保持连接,提高效率。4.避免重......
  • DdddOcr 带带弟弟OCR通用验证码和 JAVA调用
    本文主要参考DdddOcr发布的最新版本启动服务端,以及JAVA如何和服务端对接。DdddOcr,其由作者与kerlomz共同合作完成,通过大批量生成随机数据后进行深度网络训练,本身并非针对任何一家验证码厂商而制作,本库使用效果完全靠玄学,可能可以识别,可能不能识别。DdddOcr、最简依赖......
  • Python 将PowerPoint (PPT/PPTX) 转为HTML
    1.Python 将PowerPoint文档转为HTML格式要实现该转换,仅需加一个.ppt或.pptx文档,然后使用 Presentation.SaveToFile() 方法将其另存为HTML格式。fromspire.presentation.commonimport*fromspire.presentationimport*#加载PPT文档ppt=Presentation()ppt.L......
  • 利用Python训练手势模型代码
    importcv2ascvimportosimportnumpyasnpfromsklearn.decompositionimportPCAfromsklearn.model_selectionimporttrain_test_splitfromsklearn.svmimportSVCfromsklearn.treeimportDecisionTreeClassifierfromsklearn.neighborsimportKNeighborsClassifie......
  • python 基础习题3--数据类型和运算符
    1.  100/4+2*3 运行结果是 ()                    A、10B、81C、31D、50    E、31.02. Python 中的== 代表的是 (  )A、把左边的值赋值给右边;B、把右边的值赋值给左边 ;C、比较左右......
  • python计算雨水含量(W)
     数据: #!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Suyue@file:raincontent.py@time:2024/05/23@desc:"""importnumpyasnpimportpandasaspdimportxlwtimportmathdf1=pd.read_excel('20240510五原数浓......
  • python DataFrame之MultiIndex 的使用
    importpandasaspdimportpprintasp#嵌套列表arrays=[['a','a','b','b'],[1,2,1,2]]#创建MultiIndexindex=pd.MultiIndex.from_arrays(arrays,names=('letter','number'))#使用MultiInd......
  • [Python] pipe模块
    一.概述我们都知道在Linux下执行命令ls|sort-r会将排序后的结果进行输出,它是先获取目录数据,管道符|将ls的输出作为后一个命令的输入,最终得到反向排序的结果。Python和其他大多数语言一样,处理数据的时候通常是将数据作为参数传入。但是有没有像Linux管道符那样优雅的输出呢?有......