Skip to content

Commit c5883f3

Browse files
committed
feat(og): enhance Open Graph image generation with responsive layouts and font integration
- Updated OgService to implement responsive layout strategies based on photo aspect ratios. - Introduced new PhotoDimensions interface for simplified dimension handling. - Enhanced OgTemplate to support dynamic site branding and improved information hierarchy. - Integrated custom fonts for better visual presentation in generated images. - Added README documentation for the OG image generation module, detailing design principles and usage. Signed-off-by: Innei <tukon479@gmail.com>
1 parent caf47a4 commit c5883f3

File tree

8 files changed

+769
-600
lines changed

8 files changed

+769
-600
lines changed

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ photos/*.HEIC filter=lfs diff=lfs merge=lfs -text
22
photos/*.MOV filter=lfs diff=lfs merge=lfs -text
33
photos/*.jpg filter=lfs diff=lfs merge=lfs -text
44
photos/**/*.{jpg,jpeg,png,gif,webp,svg,mp4,mov,avi,mkv,mp3,wav,flac} filter=lfs diff=lfs merge=lfs -text
5+
*.ttf filter=lfs diff=lfs merge=lfs -text

be/apps/core/src/global.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import 'vite/client'
Lines changed: 296 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,296 @@
1+
# OG 图片生成模块
2+
3+
## 设计理念
4+
5+
新的 OG 图片设计采用**极简主义、照片为中心、响应式布局**的设计方案,确保在社交媒体分享时照片本身是绝对的视觉焦点,并且针对不同照片比例自动选择最佳布局。
6+
7+
## 响应式布局策略
8+
9+
### 四种布局模式
10+
11+
根据照片的宽高比,自动选择最合适的布局模式:
12+
13+
#### 1. **竖版照片** (比例 < 0.85,如 3:4)
14+
15+
```
16+
┌──────────────────────────────────────┐
17+
│ [品牌] │
18+
│ ┌──────┐ 标题文字 #tag1 │
19+
│ │ │ 📷 相机 │
20+
│ │ 照片 │ ⚫ f/2.8 | ⏱️ 1/250s │
21+
│ │ │ ━━━ │
22+
│ └──────┘ │
23+
└──────────────────────────────────────┘
24+
左右分栏布局 - 照片占满高度
25+
```
26+
27+
#### 2. **方形照片** (比例 0.85~1.15,如 1:1)
28+
29+
```
30+
┌──────────────────────────────────────┐
31+
│ [品牌] │
32+
│ ┌───────┐ 标题文字 #tag1 │
33+
│ │ │ 📷 相机 │
34+
│ │ 照片 │ ⚫ f/2.8 | ⏱️ 1/250s │
35+
│ │ │ ━━━ │
36+
│ └───────┘ │
37+
└──────────────────────────────────────┘
38+
左右分栏布局 - 均衡布局
39+
```
40+
41+
#### 3. **普通横版照片** (比例 1.15~2.2,如 4:3, 3:2)
42+
43+
```
44+
┌──────────────────────────────────────┐
45+
│ [品牌] │
46+
│ ┌──────────────┐ │
47+
│ │ 照片 │ │
48+
│ └──────────────┘ │
49+
│ 标题文字 #tag1 │
50+
│ 📷 相机 | ⚫ f/2.8 | ⏱️ 1/250s │
51+
│ ━━━ │
52+
└──────────────────────────────────────┘
53+
上下堆叠布局 - 照片占满宽度
54+
```
55+
56+
#### 4. **超宽横版照片** (比例 > 2.2,如 16:9, 21:9)
57+
58+
```
59+
┌──────────────────────────────────────┐
60+
│ [品牌] │
61+
│ ┌────────────────────────┐ │
62+
│ │ 照片 │ │
63+
│ └────────────────────────┘ │
64+
│ 标题 #tag1 │
65+
│ 📷 相机 | ⚫ f/2.8 │
66+
│ ━━━ │
67+
└──────────────────────────────────────┘
68+
紧凑堆叠布局 - 最大化照片展示
69+
```
70+
71+
## 设计特点
72+
73+
### 1. 智能响应式布局
74+
75+
**自动布局选择**:
76+
77+
- ✅ 根据照片宽高比自动选择最佳布局
78+
- ✅ 竖版/方形照片使用左右分栏,充分利用垂直空间
79+
- ✅ 横版照片使用上下堆叠,充分展示宽度
80+
- ✅ 超宽照片使用紧凑布局,避免过多留白
81+
- ✅ 所有布局都保持照片原始比例,不变形裁剪
82+
83+
**空间利用率**:
84+
85+
- 竖版/方形: 照片高度占满 (510px),信息占据右侧剩余空间
86+
- 普通横版: 照片宽度占满 (1080px),信息在底部
87+
- 超宽横版: 照片占 70% 高度,信息栏紧凑排列
88+
89+
### 2. 核心改进
90+
91+
相比旧版设计,新版有以下改进:
92+
93+
#### ✅ 去除冗余装饰
94+
95+
- 移除了胶片孔装饰
96+
- 移除了"FILM 400 | STUDIO CUT"等文字
97+
- 移除了虚线框等多余视觉元素
98+
- 移除了复杂的背景装饰图形
99+
100+
#### ✅ 照片为绝对主角
101+
102+
- 照片占据约 75% 的画布空间
103+
- 照片保持原始比例,不强制裁剪
104+
- 添加精致的阴影和高光效果,提升质感
105+
- 圆角设计更现代
106+
107+
#### ✅ 信息层次优化
108+
109+
- **主要信息**: 照片标题 (42px, 粗体)
110+
- **辅助信息**: EXIF 参数 (20px, 横排图标)
111+
- **次要信息**: 日期 (18px, 半透明)
112+
- **品牌元素**: 网站名称 (右上角,18px, 低透明度)
113+
114+
#### ✅ 智能响应式布局
115+
116+
- 四种布局模式自动切换(竖版分栏/方形分栏/横版堆叠/超宽紧凑)
117+
- 根据照片比例选择最佳布局,最大化空间利用
118+
- 所有模式都保持照片原始比例
119+
- 信息栏根据布局自动调整尺寸和排列
120+
- 消除不必要的留白
121+
122+
#### ✅ 品牌定制化
123+
124+
- 使用 `siteConfig.accentColor` 作为装饰条颜色
125+
- 显示网站名称 `siteConfig.name`
126+
- 可自定义强调色,增强品牌识别度
127+
128+
### 3. 技术优化
129+
130+
#### 简化数据结构
131+
132+
**旧版接口**:
133+
134+
```typescript
135+
interface FrameDimensions {
136+
frameWidth: number
137+
frameHeight: number
138+
imageAreaWidth: number
139+
imageAreaHeight: number
140+
displayWidth: number
141+
displayHeight: number
142+
}
143+
```
144+
145+
**新版接口**:
146+
147+
```typescript
148+
interface PhotoDimensions {
149+
width: number
150+
height: number
151+
}
152+
```
153+
154+
新版在模板内部计算显示尺寸,逻辑更清晰,service 层更简洁。
155+
156+
#### 模板参数优化
157+
158+
```typescript
159+
interface OgTemplateProps {
160+
photoTitle: string // 照片标题
161+
siteName: string // 网站名称 (新增)
162+
tags: string[] // 标签 (最多3个)
163+
formattedDate?: string // 格式化日期
164+
exifInfo?: ExifInfo // EXIF 信息
165+
thumbnailSrc?: string // 缩略图 data URL
166+
photoDimensions: PhotoDimensions // 照片原始尺寸
167+
accentColor?: string // 品牌强调色 (新增)
168+
}
169+
```
170+
171+
### 4. 布局尺寸规范
172+
173+
#### 画布尺寸
174+
175+
- **固定**: 1200×630px (标准 OG 尺寸)
176+
177+
#### 竖版/方形分栏布局
178+
179+
| 元素 | 尺寸/值 |
180+
| ---------- | ------------------- |
181+
| 外边距 | 60px |
182+
| 照片高度 | 510px (占满高度) |
183+
| 照片宽度 | 根据比例计算 |
184+
| 信息栏宽度 | 剩余空间 - 50px间距 |
185+
| 标题字体 | 42px, 粗体 |
186+
| EXIF 字体 | 18px |
187+
| 标签字体 | 16px |
188+
| 强调色条 | 80×3px |
189+
190+
#### 横版堆叠布局
191+
192+
| 元素 | 尺寸/值 |
193+
| ---------- | ----------------------- |
194+
| 外边距 | 60px |
195+
| 照片宽度 | 1080px (占满宽度) |
196+
| 照片高度 | 根据比例计算,最大 430px |
197+
| 照片下边距 | 28px |
198+
| 标题字体 | 42px, 粗体 |
199+
| EXIF 字体 | 18px |
200+
| 标签字体 | 16px |
201+
| 强调色条 | 80×3px |
202+
203+
#### 超宽紧凑布局
204+
205+
| 元素 | 尺寸/值 |
206+
| ---------- | ----------------------- |
207+
| 外边距 | 50px |
208+
| 照片宽度 | 1100px (占满宽度) |
209+
| 照片高度 | 根据比例计算,最大 450px |
210+
| 照片下边距 | 32px |
211+
| 标题字体 | 32px, 粗体 (紧凑) |
212+
| EXIF 字体 | 16px (紧凑) |
213+
| 标签字体 | 14px (紧凑) |
214+
| 强调色条 | 60×3px |
215+
216+
### 5. 配色方案
217+
218+
```css
219+
/* 背景渐变 */
220+
background: linear-gradient(135deg, #0a0a0a 0%, #1a1a1a 50%, #0f0f0f 100%)
221+
222+
/* 文字颜色 */
223+
标题: #ffffff
224+
相机信息: rgba(255,255,255,0.7)
225+
EXIF 参数: rgba(255,255,255,0.8)
226+
日期: rgba(255,255,255,0.5)
227+
品牌标识: rgba(255,255,255,0.4)
228+
229+
/* 装饰元素 */
230+
强调色条: siteConfig.accentColor (默认 #007bff)
231+
照片阴影: 0 20px 60px rgba(0,0,0,0.5)
232+
```
233+
234+
## 使用示例
235+
236+
OG 图片会自动为每张照片生成,访问路径:
237+
238+
```
239+
GET /og/{photoId}
240+
```
241+
242+
示例:
243+
244+
```
245+
https://your-site.com/og/DSCF1234
246+
```
247+
248+
## 性能特点
249+
250+
1. **缓存策略**:
251+
- `Cache-Control: public, max-age=31536000`
252+
- 永久缓存,适合静态内容
253+
254+
2. **字体加载**:
255+
- Geist Medium (英文)
256+
- PingFang SC (中文)
257+
- 字体数据内联,无需网络请求
258+
259+
3. **缩略图处理**:
260+
- 优先使用本地文件
261+
- 支持多种路径候选
262+
- 转换为 data URL 嵌入
263+
264+
## 布局决策逻辑
265+
266+
```typescript
267+
照片宽高比 = 照片宽度 / 照片高度
268+
269+
if (比例 < 0.85) {
270+
→ 竖版分栏布局 (portrait-split)
271+
→ 照片左侧,信息右侧
272+
→ 示例: 3:4 人像照片
273+
} else if (0.85 <= 比例 <= 1.15) {
274+
→ 方形分栏布局 (square-split)
275+
→ 照片左侧,信息右侧
276+
→ 示例: 1:1 Instagram 风格
277+
} else if (比例 > 2.2) {
278+
→ 超宽紧凑布局 (wide-full)
279+
→ 照片上方,信息紧凑排列
280+
→ 示例: 16:9, 21:9 超宽屏
281+
} else {
282+
→ 横版堆叠布局 (landscape-stacked)
283+
→ 照片上方,信息下方
284+
→ 示例: 4:3, 3:2 常规横版
285+
}
286+
```
287+
288+
## 设计原则总结
289+
290+
1. **Responsive First**: 没有一种布局适合所有照片,必须响应式适配
291+
2. **Less is More**: 去除一切不必要的装饰元素
292+
3. **Content First**: 照片永远是主角,最大化展示面积
293+
4. **Information Hierarchy**: 清晰的信息层次,支持紧凑和常规两种模式
294+
5. **No Wasted Space**: 消除留白,充分利用画布空间
295+
6. **Brand Consistency**: 与网站设计风格一致
296+
7. **Social Optimized**: 在各平台预览中都表现优秀
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:62d7975c788e6442421623b8a5ab6bfc91174358ea515813d9261fbb9f344060
3+
size 126744
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:4e72c835fe739bfc3cf48f3add941e78aab40ce4171b63cf6008b067a2891f48
3+
size 18157980

0 commit comments

Comments
 (0)