retro-table-print · git:20260815.0df5a92 · 2026-08-15 · sha256 a866e9142331159f

retro-table-print git:20260815.0df5a92A

Immutable. This exact content never changes and is served at /api/v1/blob/a866e9142331159f.

---
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 的运行输入,不单独授权作其他使用。