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

234 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 海报模块 v2 (poster_v2)
## 概述
基于小红书风格的海报生成模块支持5种布局、5种主题可与真实图片结合生成美观的营销海报。
## 目录结构
```
poster_v2/
├── __init__.py # 入口: PosterFactory, PosterContent, Theme
├── factory.py # PosterFactory 统一生成入口
├── config.py # 配置管理 (从项目统一配置读取)
├── schemas/
│ ├── content.py # PosterContent 数据模型
│ └── theme.py # Theme 主题配置
├── layouts/
│ ├── base.py # BaseLayout 抽象基类
│ ├── hero_bottom.py # 布局A: 大图底部文字
│ ├── overlay_center.py # 布局B: 居中叠加
│ ├── overlay_bottom.py # 布局C: 底部毛玻璃
│ ├── split_vertical.py # 布局D: 左图右文
│ └── card_float.py # 布局E: 悬浮卡片
├── renderers/
│ ├── text.py # 文字渲染器
│ ├── shape.py # 形状渲染器
│ └── effect.py # 效果渲染器
└── themes/
└── __init__.py
```
## 使用方式
### 基础用法
```python
from poster_v2 import PosterFactory, PosterContent
factory = PosterFactory()
# 直接生成
poster = factory.generate(
layout="hero_bottom",
theme="ocean",
title="景点标题",
subtitle="副标题描述",
price="¥199",
tags=["周末游", "亲子"]
)
poster.save("output.png")
```
### 带真实图片
```python
from PIL import Image
img = Image.open("photo.jpg")
content = PosterContent(
title="广东小新疆",
subtitle="绝美秘境等你来",
price="¥0",
image=img
)
poster = factory.generate_from_content(content, layout="hero_bottom", theme="sunset")
```
### 智能推荐布局
```python
# 根据内容特征推荐布局
layout = factory.suggest_layout({"emoji": "🍰"}) # → overlay_bottom
layout = factory.suggest_layout({"features": ["A", "B", "C", "D"]}) # → card_float
```
## 5种布局
| 布局 | 类名 | 适用场景 | 特点 |
|-----|------|---------|------|
| **hero_bottom** | HeroBottomLayout | 景点、美食、通用 | 大图+底部渐变文字区 |
| **overlay_center** | OverlayCenterLayout | 攻略、活动 | 居中大标题+装饰线 |
| **overlay_bottom** | OverlayBottomLayout | 美食探店 | 底部毛玻璃+emoji支持 |
| **split_vertical** | SplitVerticalLayout | 酒店、民宿 | 左图右文50/50分栏 |
| **card_float** | CardFloatLayout | 精品推荐 | 悬浮白色卡片+阴影 |
## 5种主题
| 主题 | 名称 | 主色 | 适用场景 |
|-----|------|------|---------|
| **ocean** | 深青海洋 | #4A8B8B | 海洋、旅游、清新 |
| **sunset** | 日落暖橙 | #D66853 | 美食、活力、温暖 |
| **peach** | 蜜桃粉 | #D4918A | 甜品、少女、浪漫 |
| **mint** | 薄荷绿 | #6A9B88 | 自然、民宿、健康 |
| **latte** | 拿铁咖啡 | #8B7355 | 咖啡、高级、复古 |
## PosterContent 字段
| 字段 | 类型 | 说明 |
|-----|------|------|
| `title` | str | 主标题 (必填) |
| `subtitle` | str | 副标题 |
| `price` | str | 价格 (如 "¥199") |
| `price_suffix` | str | 价格后缀 (如 "/人") |
| `tags` | List[str] | 标签列表 |
| `highlights` | List[str] | 亮点标签 (overlay_bottom) |
| `features` | List[str] | 特色列表 (card_float) |
| `details` | List[str] | 详情列表 |
| `label` | str | 角标 (如 "精选推荐") |
| `emoji` | str | emoji符号 |
| `image` | PIL.Image | 背景图片 |
## 配置
配置优先级:
1. 环境变量 `POSTER_FONT_DIR` / `POSTER_EMOJI_FONT`
2. 项目配置 `config/app.yaml``paths.resource.font`
3. 默认值 `assets/font`
## 测试脚本
```bash
# 基础测试
python scripts/test_poster_v2.py
# 真实图片测试
python scripts/test_poster_v2_real_image.py
```
输出目录:
- `result/poster_v2_test/` - 基础测试结果
- `result/poster_v2_real/` - 真实图片测试结果
## API 接口
### 方式1: 智能海报生成 (推荐)
AI 自动生成海报文案,适合只有产品基本信息的场景:
```bash
POST /api/aigc/execute
{
"engine": "poster_smart",
"params": {
"category": "景点",
"name": "正佳极地海洋世界",
"description": "位于广州正佳广场的大型海洋馆",
"price": "199元/人",
"location": "广州天河",
"features": "企鹅馆, 海豚表演, 儿童乐园",
"target_audience": "亲子家庭",
"image_url": "https://...",
// 可选: 覆盖AI推荐
"override_layout": "hero_bottom",
"override_theme": "ocean"
}
}
```
返回:
```json
{
"success": true,
"data": {
"image_base64": "...",
"layout": "hero_bottom",
"theme": "ocean",
"generated_content": {
"title": "🐧 正佳海洋世界真的绝了",
"subtitle": "周末带娃去的,企鹅太可爱了!",
"highlights": ["适合遛娃", "出片率高"],
"price": "¥199"
}
}
}
```
### 方式2: 直接海报生成
已有完整文案时使用:
```bash
POST /api/aigc/execute
{
"engine": "poster_generate_v3",
"params": {
"layout": "hero_bottom",
"theme": "ocean",
"content": {
"title": "标题",
"subtitle": "副标题",
"price": "¥199",
"tags": ["周末游", "亲子"]
},
"image_url": "https://..."
}
}
```
### 响应
```json
{
"success": true,
"data": {
"image_base64": "...",
"layout": "hero_bottom",
"theme": "ocean"
}
}
```
### 服务层直接调用
```python
from poster_v2 import get_poster_service_v2
service = get_poster_service_v2()
result = service.generate(
layout="hero_bottom",
theme="ocean",
content={"title": "标题", "price": "¥199"},
image_base64="..." # 可选
)
```
## 设计原则
1. **布局与渲染分离** - Layout 负责计算位置Renderer 负责绘制
2. **动态内容适配** - 内容区域根据文案自动计算高度
3. **主题可配置** - 配色/字体可通过主题切换
4. **单一职责** - 每个布局类只负责一种布局