jinye_huang dcfd820ca4 feat(poster_v2): 智能海报生成引擎 v1.0
- 新增 PosterSmartEngine,AI 生成文案 + 海报渲染
- 5 种布局支持文本换行和自适应字体
- 修复按钮/标签颜色显示问题
- 优化渐变遮罩和内容区域计算
- Prompt 优化:标题格式为产品名+描述
2025-12-10 15:04:59 +08:00

84 lines
2.2 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
海报模块配置
从项目统一配置读取,支持环境变量覆盖
"""
import os
import logging
from pathlib import Path
logger = logging.getLogger(__name__)
# 项目根目录
PROJECT_ROOT = Path(__file__).parent.parent
def _get_font_dir_from_config() -> Path:
"""从项目统一配置读取字体目录"""
# 优先使用环境变量
if os.environ.get("POSTER_FONT_DIR"):
return Path(os.environ["POSTER_FONT_DIR"])
# 尝试从项目配置读取
try:
from core.config_loader import get_config
config = get_config()
font_path = config.get("paths.resource.font")
if font_path:
# 相对路径转换为绝对路径
if not font_path.startswith("/"):
return PROJECT_ROOT / font_path
return Path(font_path)
except Exception as e:
logger.debug(f"从统一配置读取字体路径失败: {e}")
# 默认路径
return PROJECT_ROOT / "assets" / "font"
# 字体目录
FONT_DIR = _get_font_dir_from_config()
# Emoji 字体路径 - 支持环境变量覆盖
EMOJI_FONT_PATH = Path(os.environ.get(
"POSTER_EMOJI_FONT",
"/usr/share/fonts/truetype/noto/NotoColorEmoji.ttf"
))
# 字体映射
FONT_FILES = {
"title_bold": "兰亭粗黑简.TTF",
"title_heavy": "兰亭特黑简 GBK.TTF",
"title_poster": "华康海报体简.ttc",
"title_cute": "字体管家棉花糖.TTF",
"body_regular": "腾祥麦黑简.TTF",
"handwrite": "邓玉二笔体.ttf",
}
def get_font_path(font_name: str) -> Path:
"""获取字体完整路径"""
if font_name == "emoji":
return EMOJI_FONT_PATH
filename = FONT_FILES.get(font_name, FONT_FILES["body_regular"])
return FONT_DIR / filename
def validate_fonts() -> dict:
"""验证字体文件是否存在"""
result = {"valid": True, "missing": []}
for name, filename in FONT_FILES.items():
path = FONT_DIR / filename
if not path.exists():
result["valid"] = False
result["missing"].append((name, str(path)))
if not EMOJI_FONT_PATH.exists():
result["valid"] = False
result["missing"].append(("emoji", str(EMOJI_FONT_PATH)))
return result