80 lines
2.9 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
海报模板的抽象基类
"""
import logging
from abc import ABC, abstractmethod
from typing import Tuple, Dict, Any, Optional, List
from PIL import Image, ImageDraw
# 依赖本地的工具类
from ..utils import ImageProcessor, TextRenderer
logger = logging.getLogger(__name__)
class BaseTemplate(ABC):
"""
所有海报模板的抽象基类。
定义了模板的通用接口和基础功能。
"""
def __init__(self, size: Tuple[int, int] = (900, 1200), font_dir: str = "/root/autodl-tmp/TCC_RESTRUCT/assets/font"):
self.width, self.height = size
self.size = size
self.image_processor = ImageProcessor()
self.text_renderer = TextRenderer(font_dir=font_dir)
self.logger = logging.getLogger(self.__class__.__name__)
@abstractmethod
def generate(self, **kwargs) -> Image.Image:
"""
生成海报的核心方法。
每个子类必须实现此方法。
kwargs: 包含生成海报所需的所有动态参数,如图片路径、文案内容等。
"""
pass
def create_canvas(self, background_color: Optional[Tuple[int, int, int, int]] = None) -> Image.Image:
"""创建一个指定尺寸和颜色的空白画布"""
color = background_color or (255, 255, 255, 255)
return Image.new("RGBA", self.size, color)
def create_gradient_background(self,
top_color: Tuple[int, int, int],
bottom_color: Tuple[int, int, int],
direction: str = "vertical") -> Image.Image:
"""创建渐变背景图"""
canvas = Image.new("RGBA", self.size)
draw = ImageDraw.Draw(canvas)
r1, g1, b1 = top_color
r2, g2, b2 = bottom_color
if direction == "vertical":
for i in range(self.height):
ratio = i / self.height
r = int(r1 * (1 - ratio) + r2 * ratio)
g = int(g1 * (1 - ratio) + g2 * ratio)
b = int(b1 * (1 - ratio) + b2 * ratio)
draw.line([(0, i), (self.width, i)], fill=(r, g, b, 255))
else: # horizontal
for i in range(self.width):
ratio = i / self.width
r = int(r1 * (1 - ratio) + r2 * ratio)
g = int(g1 * (1 - ratio) + g2 * ratio)
b = int(b1 * (1 - ratio) + b2 * ratio)
draw.line([(i, 0), (i, self.height)], fill=(r, g, b, 255))
return canvas
def _validate_inputs(self, required_keys: List[str], **kwargs) -> bool:
"""一个简单的输入验证辅助方法"""
for key in required_keys:
if key not in kwargs or kwargs[key] is None:
self.logger.error(f"生成海报失败: 缺少必需的参数 '{key}'")
return False
return True