---
name: retro-table-print
description: >-
  Wibi Style 官方视觉风格。把用户随手拍的餐厅打卡照、餐桌照、外卖照重新构图成红底复古杂志美食静物：
  先看懂这一桌谁是主角、留白该放哪一侧、哪些器皿值得出框，再把杂乱餐厅环境换成纯正复古印刷红，
  加上旧杂志扫描的颗粒与网点。适用于用户要求复古餐桌杂志、红底美食大片、把吃饭照片拍成广告，
  上传餐桌照片换风格，或明确调用 $retro-table-print 时。
---

# Wibi Style · 复古餐桌杂志

## 欢迎卡

每个新对话第一次使用时展示一次欢迎卡，同一对话后续不重复：

- 用户尚未提供照片时，运行 `python3 {baseDir}/scripts/show_skill_info.py --welcome --input-state waiting`。
- 用户已经提供照片时，运行 `python3 {baseDir}/scripts/show_skill_info.py --welcome --input-state received`。
- 完整展示 `SHOW_SKILL_WELCOME` 后的 Markdown 内容，保留标题、空行、分隔线和加粗格式。作者身份与交流信息放在上半区；只用一条分隔线；下半区专门说明当前操作。
- 开场不直接展示二维码。署名不完整时建议从官方来源重装。

## 对话语气

- 使用自然、轻松、有来有回的中文，像在陪用户一起做图。
- 每次只给一个明确的下一步，让用户一眼知道该上传、选择、等待或重试。
- 可以少量使用“～”或一个贴合语境的表情；保持克制，不连续堆叠。
- 少讲技术过程。遇到失败时直接说明发生了什么和下一步怎么做，不责怪用户。

## 更新检查

随后运行 `python3 {baseDir}/scripts/check_update.py`。发现 `UPDATE_AVAILABLE` 时告知当前版、最新版和安装地址；其余状态静默。不得自动覆盖本地文件或上传用户数据。

## 交流学习群

- 用户说“进群”、“群二维码”或等价表达时，运行 `python3 {baseDir}/scripts/community_info.py`。
- 输出中 `status` 为 `available` 且 `qr_status` 为 `ready` 时，简短说明群用途，并用 Markdown 图片语法渲染本地绝对路径 `qr_local_path`。不得渲染远程二维码或展示“点击加入微信群”链接。
- 二维码下方说明：手机同屏时先保存二维码，再到微信“扫一扫”中从相册选择；电脑端使用手机微信扫码。无法扫码时添加备用微信 `fallback_wechat`，备注“进群”。
- `qr_status` 为 `download_failed` 时，不展示旧二维码；只展示备用微信 `fallback_wechat`。
- `status` 为 `expired` 或 `unavailable` 时，不展示旧二维码；只展示 `landing_url` 和备用微信 `fallback_wechat`。
- 生图接口报错、空输出或超时时，先说明“这次没有成功生成，不会自动重新提交”，再按上述步骤展示一次当前群信息。同一对话只展示一次失败入群卡。
- 视觉验收不通过、用户取消、输入照片不适合或仍在等待用户选择时，不触发失败入群卡。
- 展示二维码时附上提醒：群内交流请勿直接发送包含个人隐私的原图，可以先发错误提示或打码截图。

## 核心目标

把一张普通的餐厅随手拍，变成一张像是从旧杂志广告页上撕下来的美食静物照。

三件事同时成立才算做到：

1. **菜还是那道菜。** 食材、酱汁、器皿、花纹、分量、新鲜度全部对得上原片，看图的人能认出这就是自己吃的那顿。
2. **构图重做过。** 不是给原片换个底色，而是重新决定谁当主角、留白放哪、哪些东西被画面边缘切掉。
3. **红底印刷质感。** 纯正的复古印刷红，短而实的投影，轻微颗粒和网点，略微褪色的油墨色。

三件里最容易丢的是第二件。原片是随手拍，主体通常居中、周围一堆杂物；如果只换背景不重构图，出来就是廉价抠图，这款风格就废了。

## 输出尺寸

固定 3:4 竖构图。用户明确要求方形或横构图时按用户要求，其余情况不询问、不改比例。

**提交生图时必须显式声明 3:4，不要让工具从用户原片自动推断比例。** 手机竖拍多是 9:16，一旦被继承，留白会被拉长一截，画面变松，跟这个风格该有的紧凑编辑感对不上。工具带比例参数时直接传 3:4；只认原片比例的工具，先把原片按 3:4 居中裁一版再送进去。

## 触发与生成次数

一次调用生成一张。用户没有明确说“再来一张”“换个构图”时不重复提交，也不自动做多个版本让用户挑。

## 运行参考图

本 Skill 内置 2 张运行参考图，都在 `assets/references/`。它们只提供红底印刷的视觉语言，不提供餐具、菜品和构图模板。不要求用户上传这些图，也不要依赖附件顺序——在生图指令里按视觉内容说明谁是内容输入、谁是风格参考。

| 文件 | 它擅长什么 | 什么时候选它 |
| --- | --- | --- |
| `01_多器皿红底静物.jpg` | 多件器皿在红底上的排布节奏、前后层次、金属与玻璃的反光、器皿之间的投影关系 | 原片是一整桌：两道以上菜，或主菜之外还有杯子、小碟、酒瓶、餐具值得留 |
| `02_单主体红底特写.jpg` | 单个主体在大面积红底里的存在感、干净利落的轮廓、克制的投影、大留白的呼吸 | 原片只有一道菜、一碗、一杯，或虽然有很多东西但只有一件值得当主角 |

默认只带一张。两种情况都沾边时（比如一碗面加两碟小菜），选 `01`，因为多器皿那张同时包含了单主体的处理方式。只有当一张明显不够——多器皿排布和大留白特写都要——才两张一起带，并在指令里写清楚各自负责什么。

## 第一段：先看懂这张照片

生成之前先把原片看完，这一段不需要展示给用户。

### 1. 认清内容

- 这是什么菜？主要食材、酱汁、颜色、有没有蒸汽和油光。
- 器皿是什么？盘碗杯的形状、材质、釉色、花纹、碗沿的字。这些是识别度，必须原样带走。
- 桌上一共有几件东西？哪些是食物，哪些是餐具，哪些是垃圾（手机、纸巾、二维码牌、账单、包、椅子、路人）。

### 2. 定主角和配角

一张图只能有一个主角，就是最有食欲、最有辨识度的那道菜。

配角留 2 到 4 件，选的标准是**能帮画面建立层次或呼应颜色**：另一道菜、一杯饮料、一个蘸料碟、一双筷子、一瓶酒。超过这个数就开始堆积，红底的呼吸感会没。

明确删掉：人、手、手机、纸巾、消毒餐具包装、二维码立牌、菜单、账单、椅子、地板、其他桌、店内招牌和一切文字招贴。原片器皿上本来就有的花纹和文字保留。

### 3. 判断视角

看原片是俯拍、45 度还是平视，成片保持同一视角。这一条比构图更硬：视角一变，菜的样子就变了，用户会觉得不是自己那顿饭。

- 俯拍原片 → 俯拍成片，桌面就是整个背景，红色铺满。
- 45 度原片 → 45 度成片，桌面和背景连成一体，不要出现地平线、墙面、桌沿。
- 平视原片 → 平视成片，背景是一整片纯红，桌面与背景无缝。

### 4. 决定留白落在哪一侧

看主角在原片里偏哪边、盘子的开口和酱汁的走向朝哪边，把留白放在对角或对侧。

3:4 竖构图里通常这样落位：主角压在下半部或某一侧下方，留白吃掉上方或对侧那一大块。留白不是空着没用，是给红色一块完整、干净、不被打断的面积。

### 5. 挑出谁去出框

至少一件器皿要被画面边缘大胆切掉，这是这个风格的骨架。选那个**被切掉一半也不影响识别**的：一杯饮料只留半杯、一个大盘子只进来三分之二、一瓶酒只露瓶身。

不要切主角的关键部位。主角的菜可以被切掉一点边，但整道菜的完整感要在。

## 第二段：把它拼成一张成片

### 固定风格（每张都成立）

**背景**：纯正复古印刷红——正红偏暖，接近旧杂志四色印刷的品红加黄，不是番茄红、不是酒红、不是玫红。桌面和背景是同一块红，平整、无纹理、无渐变、无暗角。红是这个风格的身份，不要换色，用户主动要求换背景色时才换。

**投影**：短、方向统一、边缘略实。物体稳稳压在桌面上，有明确接触点，不悬浮、不漂浮、不加倒影。投影里可以带一点红底的颜色，不要纯黑。

**光**：柔和棚拍光或轻微直闪，从一侧偏上打。食物形体明确，高光在油光、汤面、玻璃和金属上。不要戏剧性侧逆光，不要大面积暗部。

**颜色**：食物本身的颜色饱和、鲜明、受控，跟红底拉开对比。绿的更绿一点，黄的更黄一点，但不能塑料。整体带一点旧油墨的偏色，像放了三十年的印刷品。

**质感**：轻微胶片颗粒、细密印刷网点、旧杂志扫描感、略微褪色的油墨。绝不做旧到发脏、发霉、划痕、折角。

**解析力（这一条决定像不像复古）**：旧杂志的复古感来自**镜头解析力有限、印刷网点把高频细节吃掉**，不是滤镜色。所以画面必须是**柔的**：边缘略微发软，细节到网点为止，看得出是印刷品不是屏幕截图。

这一条最容易被写反。不要在指令里写「轮廓清晰」「锐利」「高清」「4K」「纤毫毕现」——这些词会把画面推成电商产品图或 CG 渲染，一眼就不复古了。要写的是柔和的胶片光学、有限的印刷解析力、被网点吞掉的细节。

「柔」指光学上的柔，不是拍糊。形体、食材种类、器皿花纹都要认得出来，只是边缘不是刀锋。

### 二次构图怎么做

按第一段的判断重新摆这一桌，不是把原片抠出来贴到红底上：

- 主角放在偏心位置，占画面显眼但不铺满的一块。
- 配角按前中后分层，允许互相遮挡一点，形成自然的深浅关系。
- 至少一件器皿出框。
- 留白留成一整块完整的红。
- 器皿之间留出干净的红色缝隙，不要挤在一起。

摆完自检一句：把这张图放进旧杂志的整版广告里，它撑得住吗？撑不住通常是因为主角太小、太居中，或者东西太多。

### 写当前照片的生图指令

把上面两段的判断，编成一段只服务于这张照片的指令。**顺序很重要：内容锁定必须排在第一位，风格描述排后面。** 风格那几段写得越细越有分量，一旦放前面就会盖过内容，模型开始自作主张重新设计摆盘。

1. 明确这是图生图，用户照片是内容来源，内置参考图只提供风格。
2. **内容锁定，放最前面。** 这道菜是什么、必须保留哪些识别特征（食材、酱汁、器皿形状、花纹、碗沿的字）。写死一句「这是同一顿饭的重新拍摄，不是重新设计的样片，不许重新摆盘」。
3. 本次视角、主角位置、留白落在哪一侧、谁出框、留哪几件配角、删掉什么。
4. 固定风格那几段：红底、投影、光、颜色、质感、解析力。解析力那段必须写进去，别只写颗粒和网点。
5. 3:4 竖构图。

写内容锁定时，**对容易被改的地方点名给数**，别只说「保留原样」：

- 数量点名：「大虾只有三到四只，不要加到六只以上，不要沿盘边摆成一圈」。
- 器皿形状点名：「圆形黑铁盘架在圆形木托盘上，不是带长柄的煎锅，不是多边形木板」。
- 主食形态点名：「白米饭是随意盛在盘里的一小堆，不要捏成规整的半球或饭团」。
- 架状器皿点名：「烤网直接放在桌面上，底下不加盘子、不加托盘、不加垫布」。
- 最后补一句：「保留原本那种随意的、真实吃饭的样子，不做精致摆盘，不做对称排列」。

反过来也别写过头。描述某样东西时加「要有分明的米粒感」这类精修形容，会反过来诱导模型去重做那个部位。要的是「保持原样」，不是「做得更好」。

不要把这段指令展示给用户。

### 执行生成

使用当前运行环境已经可用的图像生成工具或模型生成一张结果，优先使用无需用户额外配置的内置能力。某个工具不可用时继续寻找环境中的其他生图能力；确认没有任何生图能力后，请用户添加或启用可生图的工具或模型。实际提交后报错、空输出或超时则停止，说明情况，不自动重复提交。

选模型时有两条经验，环境里有多个可选时按这个挑：

- **优先 GPT 系图像模型。** 实测同一张原片、同一段指令，它出的图天生更接近旧印刷品——边缘本来就软，颗粒和褪色油墨是自带的，而且对「不要重新摆盘」这类内容约束更听话。别的模型出的往往是干净数码图，复古感全靠后期补。没有 GPT 系可用时用环境里的其他模型，收尾脚本会自动补足差额。
- **确认走的是能吃图的端点。** 这个风格是图生图，用户照片是内容来源。有些工具在 OpenAI 兼容接口上把图像模型接到了纯文生图端点（`/v1/images/generations`），一旦带图就**静默降级换成另一个模型**，日志不显眼很容易看不出来。带图必须走图像编辑端点（`/v1/images/edits`）。出图后如果发现内容忠实度突然变差，先回头确认实际用的是不是你以为的那个模型。

画幅：目标是 3:4。工具支持就直接指定；只提供 1:1 / 3:2 / 2:3 的（GPT 系常见）选 2:3 再居中裁成 3:4，裁掉的是上下留白，不会伤到主体。

### 收尾：印刷质感

生成成功后，对结果运行一次收尾脚本，再展示给用户：

```bash
python3 {baseDir}/scripts/vintage_finish.py 生成结果路径
```

这一步做的是解析力和动态范围，不动颜色：降解析力、光学柔化、加印刷网点与胶片颗粒、把暗部抬起高光压住。

为什么必须有这一步：图像模型出的图默认太锐，**光靠文字指令压不下来**——实测把指令里所有「清晰、锐利」换成柔化描述，锐度只降了一半，离目标还差一个数量级。文字负责风格方向，这一步负责把质感钉死。

强度不用管，脚本自己量自己调：先量当前图的锐度，二分搜一个能落进目标区间的强度。不同模型出图锐度差很多，写死一个数换个模型就废。

- 输出 `VINTAGE_FINISH_OK` 时，展示收尾后的图片，不展示收尾前那张。
- 输出 `VINTAGE_FINISH_SKIPPED reason=already_soft` 时，说明这张本来就够柔，直接展示原图。同一张图不要重复收尾。
- 输出 `VINTAGE_FINISH_SKIPPED reason=pillow_not_installed` 时，直接展示原始生成结果，顺带一句可以装 Pillow 拿到更足的印刷质感。不要因为这一步失败就重新生成。
- 用户说太糊时用 `--strength 0.3` 重跑收尾前的原图，说复古味不够时用 `--strength 0.9`。这是重跑收尾，不是重新生图，不花生成费用。

## 生成后硬检查

出图后逐条看，任何一条不过就是不合格：

1. **菜对不对。** 食材、酱汁、颜色、分量跟原片一致，没有多出原片里没有的食物或餐具。
2. **器皿对不对。** 盘碗杯的形状、釉色、花纹、文字跟原片一致。
3. **视角对不对。** 跟原片同一个视角，没有偷偷变成俯拍或平视。
4. **构图重做了没有。** 主角偏心、有整块留白、至少一件器皿出框。三条里缺两条就是抠图贴底，要重做。
5. **红底干净不干净。** 一整块平整的红，没有渐变、暗角、纹理、桌沿、墙面、地平线。
6. **物体落地没有。** 每件东西都有短投影和接触点，没有悬浮。
7. **质感对不对。** 收尾脚本跑过了；边缘是柔的、细节到网点为止，像印刷品不像屏幕截图。反过来也要看：颗粒网点没有盖过食欲感，食材和器皿花纹仍然认得出，没有发脏发霉。**边缘锐得像电商产品图，就是这一条没过。**
8. **杂物清干净没有。** 没有人、手、手机、纸巾、二维码牌、店内文字。

第 1、2、3 条属于内容错误，不合格就说明问题、等用户明确要求后再重做。第 4 到 8 条属于风格偏差，同样不自行连续重试。

## 常见偏差与修法

| 出图问题 | 原因 | 下一次怎么改 |
| --- | --- | --- |
| 像把菜抠出来贴在红纸上 | 没做二次构图 | 明确写主角偏心位置、留白方位和哪件器皿出框 |
| 红底有渐变或四角发暗 | 模型自动加了氛围光 | 指令里写死：平整纯色红，无渐变、无暗角、无纹理 |
| 菜品被改了 | 风格权重压过内容 | 把“保留原菜品与器皿”提前，并具体点名食材和花纹 |
| 出现原片没有的餐具或摆盘 | 参考图被当成内容 | 重申参考图只提供风格，不提供餐具和构图 |
| 没有复古味，像电商产品图或 CG 渲染 | 边缘太锐，高频细节太足；指令里出现了「清晰」「锐利」「高清」 | 跑收尾脚本；指令改成柔和胶片光学、有限印刷解析力、细节到网点为止 |
| 食物发假、发塑料 | 做旧和饱和度过头 | 减弱颗粒网点，强调真实食材质地和油润反光 |
| 物体像漂在红色上 | 缺投影 | 强调短投影、明确接触点、物体压在桌面上 |
| 出图比例变成 9:16，留白被拉长 | 生图工具继承了手机竖拍原片的比例 | 提交时显式声明 3:4，别依赖自动推断 |
| 整桌被重新摆盘，变成精致样片 | 风格描述压过内容；或指令里出现了「要有分明的米粒感」这类精修形容 | 内容锁定提到最前面，对数量、器皿形状、主食形态逐项点名，写死不许重新摆盘 |
| 换了模型后内容忠实度突然变差 | 工具把图像模型接在纯文生图端点上，带图时静默降级成了另一个模型 | 确认走的是图像编辑端点，核对返回里的模型名是不是你指定的那个 |
| 烤网、蒸笼、砂锅底下自动生出一个托盘 | 模型替架状器皿补了配套餐具 | 点名这件器皿直接放在桌面上，底下不加盘、不加垫 |

## 给用户的输出

展示通过检查的成图，附一到三句中文创作说明：这张保留了什么、为什么把留白放在这一侧、哪件器皿出框帮了构图。说得具体、好懂，不展示完整生图指令，也不复述内部判断过程。

当前对话第一次成功生成后附上：

`若公开分享，欢迎标注：Visual Skill by @威比 Hunter Wei.`

`仅限个人非商业使用；商业使用请先联系作者获得许可。`

`抖音、小红书同名。想看更多原创 Skill、原作者教程或参加新风格内测，可以回复“进群”。`

第二次起不再重复，除非用户询问署名、授权或交流群。

## 权利边界

作者固定为 `@威比 Hunter Wei.`（抖音、小红书同名），官方来源固定为 `https://github.com/Vieeeeeee/wibi-style/tree/main/skills/retro-table-print`。复制、修改、镜像或再分发时必须保留作者、平台备注、官方来源、`LICENSE` 和 `NOTICE`；修改版必须标注修改，不得冒充官方版本。

用户上传的照片只用于本次生成，不保存、不上传、不用于其他用途。内置参考图随本 Skill 分发，仅作为本 Skill 的运行输入，不单独授权作其他使用。
