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

Python 之生成验证码

时间:2023-04-07 16:11:43浏览次数:42  
标签:code get Python self random 验证码 生成 font image

一、代码

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


class Captcha:
    def __init__(self, width, height, code_num=4, code_type=1, font_size=24, is_blur=True, font='Arial.ttf',
                 x_offset=None, y_offset=None):
        """
        :param width: 验证码图片宽度
        :param height: 验证码图片高度
        :param code_num: 验证码字符个数 默认是4个
        :param code_type: 验证码类型  1字母或数字 2全字母 alpha 3全数字 digit
        :param font_size: 验证码字体尺寸
        :param is_blur: 验证码图片是否模糊处理
        :param font: 字体全路径  例如 '/Library/Fonts/Arial.ttf'
        :param x_offset: 验证码字符水平偏移量 默认自动计算
        :param y_offset: 验证码字符垂直偏移量 默认自动计算
        """
        self.width = width
        self.height = height
        self.code_num = code_num
        self.code_type = code_type
        self.font_size = font_size
        self.is_blur = is_blur
        self.font = font
        self.x_offset = x_offset
        self.y_offset = y_offset

    def save_image(self, image_path, image_type='png'):
        image = self._get_captcha_image()
        image.save(image_path, image_type)

    def save_bytes_io(self, image_type='png'):
        io_obj = BytesIO()
        image = self._get_captcha_image()
        image.save(io_obj, image_type)
        return io_obj

    def _get_captcha_image(self):
        image = Image.new('RGB', (self.width, self.height), (255, 255, 255))
        # 创建Font对象:
        font = ImageFont.truetype(self.font, self.font_size)
        # 创建Draw对象:
        draw = ImageDraw.Draw(image)
        # 填充每个像素:
        for x in range(self.width):
            for y in range(self.height):
                draw.point((x, y), fill=self._get_img_color())
        xw = self.width // self.code_num
        x_offset = self.x_offset if self.x_offset else ((self.width - self.code_num * self.font_size - (
                    self.code_num - 1) * (xw - self.font_size)) // 2) + (xw - self.font_size) // 3
        y_offset = self.y_offset if self.y_offset else (self.height - self.font_size) // 2
        # 输出文字:
        self.code = []
        for t in range(self.code_num):
            random_code = self._get_random_code()
            self.code.append(random_code)
            draw.text((xw * t + x_offset, y_offset), random_code, fill=self._get_font_color(), font=font)
        # 模糊:
        if self.is_blur:
            image = image.filter(ImageFilter.BLUR)
        return image

    def _get_random_code(self):
        if self.code_type == 1:
            return self._get_alpha_digit()
        elif self.code_type == 2:
            return self._get_alpha()
        elif self.code_type == 3:
            return self._get_digit()
        return self._get_alpha_digit()

    def _get_alpha_digit(self):
        return random.choice([self._get_alpha(), self._get_digit()])

    def _get_alpha(self):
        return random.choice([chr(random.randint(65, 90)), chr(random.randint(97, 122))])

    def _get_digit(self):
        return str(random.randint(0, 9))

    def _get_img_color(self):
        return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))

    def _get_font_color(self):
        return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

二、使用

path = os.path.dirname(__file__)
captcha = Captcha(160, 35, is_blur=False, font= path + "/captcha/Arial.ttf", code_num=5)
captcha.save_image(path + '/code.png')
print(captcha.code)
    
print(captcha.save_bytes_io())

 

标签:code,get,Python,self,random,验证码,生成,font,image
From: https://www.cnblogs.com/yang-2018/p/17296499.html

相关文章

  • Python求100以内的素数常用方法!
    与其他编程语言对比,Python拥有十分独特的优势代码量少,相同功能其他编程语言需要上百行代码才可以实现,而Python只需要十几行就可以实现。而且在Python中,我们只需要学会一些基础的语法就可以实现简单的数值计算,那么Python求100内的所有素数方法是什么?具体内容请看下文。质数......
  • 使用模板窗口生成测试数据
    1.准备工作*需要的环境1.Oralce、MySQL、PG等主流数据库2.HHDBCS7.6及以上版本*测试步骤1.建立两张表带有主外键关系2.使用模板窗口生成数据,主键表生成100条,外键表生成10000条3.校验数据生成情况2.建立两张表带有主外键关系--主键表createtabledept(d_id......
  • Python中的时间函数strftime与strptime对比
    一、striftime将给定格式的日期时间对象转换为字符串。日期时间对象=>字符串,控制输出格式.date、datetime、time对象都支持strftime(format) 方法,可用来创建由一个显式格式字符串所控制的表示时间的字符串。用法:datetime.strftime(format)importdatetimedt=datetime.dateti......
  • python+playwright 学习-50 pytest-playwright 多账号操作解决方案
    前言pytest-playwright插件可以让我们快速编写pytest格式的测试用例,它提供了一个内置的page对象,可以直接打开页面操作。但是有时候我们需要2个账号是操作业务流程,比如A账号创建了一个任务,需要用到B账号去操作审批动作等。如果需要2个账号同时登录,可以使用context上下文,它可......
  • Python源码笔记——Python中的列表对象
    1.列表结构体#definePyObject_VAR_HEADPyVarObjectob_base;typedefstruct{PyObjectob_base;Py_ssize_tob_size;/*Numberofitemsinvariablepart*/}PyVarObject;typedefstruct{PyObject_VAR_HEAD/*Vectorofpointerstolistel......
  • PHP随机生成指定时间段的指定个数时间
    一、生成某个范围内的随机时间 /***生成某个范围内的随机时间*@param<type>$begintime起始时间格式为Y-m-dH:i:s*@param<type>$endtime结束时间格式为Y-m-dH:i:s*@param<type>$now是否是时间戳格式为Boolean*/function......
  • Python源码笔记——Python对象机制的基石【PyObject】
    所有源码均基于Python3.11.21.PyObject定义//实际上没有任何东西被声明为PyObject,但是每个指向Python对象的指针都可以转换为PyObject*。//这是手动模拟的继承。同样的,每个指向可变大小的Python对象的指针也可以转换为PyObject*,此外,也可以转换为PyVarObject*。typedefst......
  • Python源码笔记——Python中的整数对象
    1.整数对象在Python3.11.2中,整数结构体叫做PyLongObject。#ifPYLONG_BITS_IN_DIGIT==30typedefuint32_tdigit;...#elifPYLONG_BITS_IN_DIGIT==15typedefunsignedshortdigit;...#else#error"PYLONG_BITS_IN_DIGITshouldbe15or30"#endiftypedefstruc......
  • Python selenium过图片滑块验证
    计算滑块移动距离defget_distance(image1,image2):'''拿到滑动验证码需要移动的距离:paramimage1:没有缺口的图片对象:paramimage2:带缺口的图片对象:return:需要移动的距离'''#print('size',image1.size)threshold=5......
  • LightOJ - 1041 Road Construction(最小生成树)
    题目大意:给你N条边,看能否形成最小生成树,如果存在,输出值,不存在,另外输出解题思路:模版题#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<string>#include<iostream>usingnamespacestd;constintMAXNOD......