62 lines
1.6 KiB
Python
62 lines
1.6 KiB
Python
"""
|
|
验证码生成器基类
|
|
|
|
所有验证码生成器继承此基类,实现 generate() 方法。
|
|
基类提供通用的 generate_dataset() 批量生成能力。
|
|
"""
|
|
|
|
import os
|
|
import random
|
|
from pathlib import Path
|
|
from PIL import Image
|
|
from tqdm import tqdm
|
|
|
|
from config import RANDOM_SEED
|
|
|
|
|
|
class BaseCaptchaGenerator:
|
|
"""验证码生成器基类。"""
|
|
|
|
def __init__(self, seed: int = RANDOM_SEED):
|
|
"""
|
|
初始化生成器。
|
|
|
|
Args:
|
|
seed: 随机种子,保证数据生成可复现。
|
|
"""
|
|
self.seed = seed
|
|
self.rng = random.Random(seed)
|
|
|
|
def generate(self, text: str | None = None) -> tuple[Image.Image, str]:
|
|
"""
|
|
生成一张验证码图片。
|
|
|
|
Args:
|
|
text: 指定标签文本。为 None 时随机生成。
|
|
|
|
Returns:
|
|
(图片, 标签文本)
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
def generate_dataset(self, num_samples: int, output_dir: str) -> None:
|
|
"""
|
|
批量生成验证码数据集。
|
|
|
|
文件名格式: {label}_{index:06d}.png
|
|
|
|
Args:
|
|
num_samples: 生成数量。
|
|
output_dir: 输出目录路径。
|
|
"""
|
|
output_path = Path(output_dir)
|
|
output_path.mkdir(parents=True, exist_ok=True)
|
|
|
|
# 重置随机种子,保证每次批量生成结果一致
|
|
self.rng = random.Random(self.seed)
|
|
|
|
for i in tqdm(range(num_samples), desc=f"Generating → {output_path.name}"):
|
|
img, label = self.generate()
|
|
filename = f"{label}_{i:06d}.png"
|
|
img.save(output_path / filename)
|