80 lines
2.9 KiB
Python
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 |