TravelContentCreator/docs/fabric_json_standard.md

307 lines
7.2 KiB
Markdown
Raw Normal View History

2025-08-04 16:04:12 +08:00
# 后端Fabric.js JSON格式规范
## 标准格式要求
### 1. 根对象结构
```json
{
"version": "5.3.0",
"width": 1350,
"height": 1800,
"objects": [
// 对象数组
]
}
```
### 2. 对象类型要求只使用标准Fabric.js类型
#### ✅ 允许的标准类型:
- `rect` - 矩形
- `circle` - 圆形
- `textbox` - 文本框
- `text` - 文本
- `image` - 图片
- `line` - 线条
- `polygon` - 多边形
- `path` - 路径
- `group` - 组
#### ❌ 禁止的自定义类型:
- `CustomRect` -> 应改为 `rect`
- `CustomTextbox` -> 应改为 `textbox`
- `CustomCircle` -> 应改为 `circle`
- `CustomGroup` -> 应改为 `group`
- `ThinTailArrow` -> 应改为 `path``rect`
- `Arrow` -> 应改为 `path``rect`
### 3. 基本对象属性要求
#### 所有对象必须包含:
```json
{
"type": "rect", // 标准类型
"left": 100, // 数值非null
"top": 50, // 数值非null
"width": 200, // 数值 > 0
"height": 100, // 数值 > 0
"fill": "#ffffff",
"opacity": 1,
"angle": 0,
"scaleX": 1,
"scaleY": 1
}
```
#### 文本对象额外属性:
```json
{
"type": "textbox",
"text": "实际文本内容", // 非空字符串
"fontSize": 16, // 数值 > 0
"fontFamily": "Arial", // 有效字体名
"fill": "#000000"
}
```
#### 图片对象要求:
```json
{
"type": "image",
"src": "https://example.com/image.jpg", // 必须是完整有效的URL
"width": 300, // 实际图片宽度
"height": 200 // 实际图片高度
}
```
**重要图片src必须是可访问的完整URL不能是**
- 相对路径如 `preview1.jpg`
- 本地路径如 `./images/test.png`
- 占位符如 `image1.jpg`
### 4. 组对象格式:
```json
{
"type": "group",
"objects": [
// 组内的标准对象
]
}
```
### 5. 完整示例:
```json
{
"version": "5.3.0",
"width": 1350,
"height": 1800,
"objects": [
{
"type": "rect",
"left": 100,
"top": 100,
"width": 200,
"height": 150,
"fill": "#ff0000",
"opacity": 1,
"angle": 0,
"scaleX": 1,
"scaleY": 1
},
{
"type": "textbox",
"left": 50,
"top": 300,
"width": 300,
"height": 50,
"text": "这是文本内容",
"fontSize": 24,
"fontFamily": "Arial",
"fill": "#000000",
"opacity": 1
},
{
"type": "image",
"left": 400,
"top": 100,
"width": 200,
"height": 200,
"src": "https://example.com/path/to/image.jpg",
"opacity": 1
}
]
}
```
## 复杂装饰元素处理策略
### 问题:复杂的装饰性元素(如按钮、装饰图案)
- **旧方案**使用多个形状组合rect + circle + path等
- **新方案**:将复杂元素预渲染为图像
### 实现方式:
1. **后端预渲染**将复杂的按钮样式、装饰图案等渲染为PNG图像
2. **托管图像**将这些装饰图像托管在可访问的URL上
3. **JSON引用**在fabric.js JSON中使用标准`image`对象引用
### 示例:按钮元素
```json
// ❌ 旧方式:复杂形状组合
{
"type": "group",
"objects": [
{"type": "rect", "fill": "linear-gradient(...)", ...},
{"type": "circle", "fill": "rgba(...)", ...},
{"type": "path", "path": "M10,10 L20,20...", ...}
]
}
// ✅ 新方式:预渲染图像
{
"type": "image",
"left": 100,
"top": 200,
"width": 120,
"height": 40,
"src": "https://your-domain.com/api/decorative/button_style_1.png",
"opacity": 1
}
```
## 关键要求总结:
1. **只使用Fabric.js标准对象类型**
2. **所有数值属性必须有效非null、非0宽高**
3. **图片src必须是完整可访问的URL**
4. **包含完整的width/height信息**
5. **遵循标准JSON结构**
6. **复杂装饰元素使用预渲染图像**
这样前端就可以直接使用 `canvas.loadFromJSON()` 而无需任何预处理!
## 装饰性图像处理流程
### 完整的端到端流程:
1. **Python端生成装饰图像**
- 使用PIL动态生成按钮、标签、价格背景等装饰元素
- 返回base64编码的PNG图像数据
- 在fabric.js JSON中使用占位符URLhttps://placeholder.qiniu.com/decorative/
2. **Java端处理装饰图像**
- 接收装饰图像的base64数据
- 上传每个装饰图像到七牛云存储
- 获取七牛云的真实URL
- 替换fabric.js JSON中的占位符URL为真实URL
3. **前端使用**
- 接收更新后的fabric.js JSON包含真实的图像URL
- 直接使用`canvas.loadFromJSON()`加载完整设计
### API响应结构
```json
{
"requestId": "poster-20250101-120000-abc123",
"templateId": "vibrant",
"resultImagesBase64": [...],
"fabricJsons": [
{
"id": "fabric_json_0",
"data": "base64_encoded_json...",
"jsonData": {
"version": "5.3.0",
"width": 1350,
"height": 1800,
"objects": [
{
"type": "image",
"src": "https://qiniu-domain.com/poster/decorative/2025/01/01/button_1234567890.png",
"left": 100,
"top": 200,
"width": 200,
"height": 60
}
]
}
}
],
"decorativeImages": {
"button": {
"originalId": "button",
"type": "button",
"qiniuUrl": "https://qiniu-domain.com/poster/decorative/2025/01/01/button_1234567890.png",
"uploadSuccess": true
}
}
}
```
## 实现状态
### ✅ 已完成:
- 标准fabric.js JSON格式输出
- 简化的文本布局只使用textbox/text
- 装饰性图像生成器(按钮、标签、价格背景)
- 装饰图像上传到七牛云的完整流程
- fabric.js JSON中占位符URL自动替换
- 统一1350x1800基础尺寸
- 端到端的装饰图像处理工作流
## 统一生成架构(重大改进)
### 问题解决:
**原问题**fabric.js JSON和PNG分开生成导致参数不一致、位置偏差等问题。
**解决方案**VibrantTemplate统一生成模式
- PNG和Fabric.js JSON在同一次render调用中生成
- 使用完全相同的参数、计算逻辑、渲染上下文
- 消除任何可能的差异来源
### 技术实现:
1. **VibrantTemplate.generate()扩展**
```python
# 新增参数
generation_result = template.generate(
content=content,
images=images,
generate_fabric_json=True # 启用统一生成
)
# 返回结构
{
'png': PIL.Image,
'fabric_json': Dict,
'metadata': {
'gradient_start': int,
'theme_color': str,
'elements_count': int
}
}
```
2. **渲染上下文共享**
- 图像处理参数
- 渐变起始位置
- 颜色提取结果
- 文本布局计算
- 所有几何计算
3. **向后兼容性**
- 自动检测模板是否支持新参数
- 无缝回退到独立生成模式
- 不影响现有的模板实现
### ✅ 已完成:
- 标准fabric.js JSON格式输出
- 简化的文本布局只使用textbox/text
- 装饰性图像生成器(按钮、标签、价格背景)
- 装饰图像上传到七牛云的完整流程
- fabric.js JSON中占位符URL自动替换
- 统一1350x1800基础尺寸
- 端到端的装饰图像处理工作流
- **VibrantTemplate统一生成架构**
- **PNG和JSON完全一致的渲染逻辑**
### 🔄 进行中:
- 测试统一生成模式的一致性验证