IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python生成验证码 开箱即用 -> 正文阅读

[Python知识库]python生成验证码 开箱即用

验证码类

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


class Captcha:
    def __init__(self, captcha_size=(150, 50),
                 font_size=40, font_style=None, text_number=6,
                 line_number=6, background_color=(255, 255, 255),
                 sources=None):
        """
        :param captcha_size: 验证码Size:tuple
        :param font_size:    字体Size:int
        :param font_style:   字体样式:ttf文件路径
        :param text_number:  验证码数量:int
        :param line_number:  干扰线条数量:int
        :param background_color: 验证码背景:rgb
        :param sources:      验证码源:str
        """
        self.captcha_width = captcha_size[0]
        self.captcha_height = captcha_size[-1]
        self.font_size = font_size
        self.text_number = text_number
        self.line_number = line_number
        self.background_color = background_color
        if font_style:
            self.font_style = font_style
        else:
            self.font_style = 'simkai.ttf'
        if sources:
            self.sources = sources
        else:
            self.sources = string.ascii_letters + string.digits

    def _get_text(self):
        text = random.sample(self.sources, k=self.text_number)
        return ''.join(text)

    def _font_color(self):
        return random.randint(0, 150), random.randint(0, 150), random.randint(0, 150)

    def _other_color(self):
        return random.randint(0, 250), random.randint(0, 250), random.randint(0, 250)

    def _draw_line(self, draw):
        begin = (random.randint(0, self.captcha_width // 2), random.randint(0, self.captcha_height // 2))
        end = (random.randint(self.captcha_width // 2, self.captcha_width),
               random.randint(self.captcha_height // 2, self.captcha_height))
        draw.line([begin, end], fill=self._other_color())

    def _draw_point(self, draw, point_chance):
        for w in range(self.captcha_width):
            for h in range(self.captcha_height):
                tmp = random.randint(0, 100)
                if tmp < point_chance:
                    draw.point((w, h), fill=self._other_color())

    def _draw_text(self, draw, text, font, spacing=20):
        """
        :param draw: 画布对象:ImageDraw
        :param text: 验证码:str
        :param font: 字体对象:ImageFont
        :param spacing: 验证码间隙:int
        """
        # 使用该字体画出来的字符串大小,与字体大小有关
        text_width, text_height = font.getsize(text)

        char_length = int(text_width / self.text_number)
        # 空白之和
        total_spacing = (self.text_number - 1) * spacing
        # 有效区域
        true_width = total_spacing + text_width
        true_height = text_height

        if true_width >= self.captcha_width:
            raise ValueError('字体加中间空隙超过图片总宽度')

        start_width = int((self.captcha_width - true_width) / 2)
        start_height = int((self.captcha_height - true_height) / 2)
        for value in text:
            position = start_width, start_height
            draw.text(position, value, font=font, fill=self._font_color())
            start_width = start_width + char_length + spacing

    def code(self):
        captcha = Image.new('RGB', (self.captcha_width, self.captcha_height), self.background_color)
        font = ImageFont.truetype(self.font_style, self.font_size)
        draw = ImageDraw.Draw(captcha)
        text = self._get_text()

        self._draw_text(draw, text, font, spacing=5)

        for _ in range(self.line_number):
            self._draw_line(draw)

        # 每个坐标的画点概率10%
        self._draw_point(draw, 10)
        return captcha, text

调用

if __name__ == '__main__':
    captcha = Captcha()
    imgObj, code = a.code()
    imgObj.save('test.png')

结果

在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-02-03 01:09:59  更:2022-02-03 01:11:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:22:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码