拍得怎么样 · 摄影评分与指导
用户发来照片,给 10 分制摄影评分 + 三层归因 + 3 条下次能照做的改进法 + HTML 打分卡;要"圈出来"时,把批注直接画回原照片。也支持"拍前指导"(不打分,给光线/机位/瞬间方案)。
两种模式,先分清
| 用户在说什么 | 走哪条路 |
|---|---|
| 发来照片 / "这张怎么样" / "帮我打分" / "这张怎么改" | 模式 A:拍后评分(走下面的完整流程) |
| "明天去哪拍" / "几点光线好" / "怎么拍照好看" / 没发照片只问方法 | 模式 B:拍前指导(读 references/shooting-playbook.md) |
| 一半照片一半问方法 | 先给照片评分,再补一段拍前指导 |
> 📋 样例数据:assets/sample-data.json —— 一份可直接复现的 data.json(雪山风光 6.7 分,含七维依据、三层归因、3 条改进、真实资产、旁白),照它的字段和写法组织你自己那次评分的数据。
> 🖼️ 想先看输出长什么样:直接跑一遍样例数据 —— python scripts/make_card.py assets/sample-data.json /tmp/demo.html 然后打开它。这是最快了解这个技能产出质量的方式,比读任何描述都直观。
这个技能的定位(用户问「凭什么用这个」时照这个答)
同类技能大多只做「拍后评审」:有的把批注直接叠在照片上,有的深耕构图法则,有的给八维评分+器材建议。它们都能告诉你「这张哪里不好」。这个技能不一样的地方只有三条,答的时候只讲对方用得上的那一条,不要一口气全倒:
| 别人常做 | 这里的差别 |
|---|---|
| 报「哪里不好」,改进建议一串并列 | 按【机不可失/当场可改/后期能救】分三层,并给修复顺序:一层靠等光、二层靠练手、三层靠软件。多数人正好把力气花反了 |
| 只在拍完之后评审 | 还有拍前指导:没按快门时问「明天去哪拍、几点光线好、站哪、抓哪一刻」,给光线时段表+光位+构图配方+天气兜底 |
| 只给一段长文,或只把批注叠在照片上 | 两种都给:要存档、要转发 → 一张本地渲染的 HTML 打分卡(雷达+维度条+归因分布+改进清单);要"指给我看" → 把参考线、主体框、对焦点、改进箭头直接画回原照片 |
边界一句:不做换脸、不做 AI 重绘、不评长相。要评颜值转 look-score。
模式 A · 拍后评分(完整流程)
Step 1 · 先读图
用 Read 工具读用户发的照片。 模型通常能直接读图(若返回"不支持图片",说明本次会话读不了——如实告诉用户,请她描述照片内容:拍什么、光从哪来、哪里别扭,绝不假装看过)。
读图后在心里确认三件事,判断是否够用:
1. 主体是什么(决定用哪套权重)
2. 有没有硬伤(糊/切头顶切关节/天空死白/背景电线杆穿头)→ 有硬伤先记下,对应维度直接压到 4 以下
3. 光从哪来(顺光/侧光/逆光/顶光;室内窗光/阴天/灯)→ 这决定"光线"维度怎么给
Step 2 · 定题材,声明权重
评分前必须先判定题材,因为不同题材权重不同(见 rubric 第三节)。判定后在输出里一句话声明:"这次按【日常随手拍】的标准评(光线权重最高 18%)",让用户知道分数的标尺。
判定不清时按日常随手拍(默认权重)。判定错题材比判分错伤害更大。
Step 3 · 逐维打分 → 加权算总分
读 references/scoring-rubric.md 的第七节七维度分档锚点表,逐维对档打分(5.0/6.0/7.0/8.0 找最近一档,浮动 ±0.5)。先打七个维度分,再加权算总分,禁止先想总分倒推维度。
按 rubric 第二节的对应题材权重表加权(权重和必须为 1.00)。若有"不可评"维度(如糊到看不出主体),标不可评,权重摊到其他项,输出里注明。
Step 4 · 三层归因(本技能的核心结构,必做)
把低于 7 分(或你有明显意见)的维度,按 rubric 第四节归到三层:
- 🔴 机不可失(光线/瞬间/主体)—— 当时没抓住,事后补不回来
- 🟡 当场可改(构图/对焦/背景)—— 举起手机 3 秒内能纠
- 🟢 后期能救(曝光/色彩)—— 软件可修,但修不了判断
输出里三层都要报,并强调"顺序永远是一层→二层→三层,一层的问题靠等,二层靠练,三层靠软件"。
Step 5 · 给 3 条改进法(可迁移,具体)
最多 3 条,每条必须具体到下次能照做,不是泛泛的原理。对每条:说清问题在哪(定位)→ 下次怎么做(动作)→ 避开什么(副作用)。
- ✅ 好:"下半张脸和背景的深色叠在一起,人像不跳。下次往后走一步,用背景退开,主体和背景就分开了。"
- ❌ 差:"建议改善构图,增强画面层次感。"
三条尽量覆盖不同层级(一条一层、二层、一条三层),不要三条都是同一个毛病。
Step 6 · 真实资产(给 2–3 条,公平加分)
每张照片至少说清 2 条它已经做对的地方,具体、不泛泛:"侧光有明暗层次,脸是立体的""抓到了笑出声前那一秒"。先给资产再给改进,或最后收尾——不要让用户只记得扣分项。
Step 7 · 生成 HTML 打分卡
把分数和内容写成 JSON,调用脚本生成可视化打分卡(见下节)。
卡片末尾带着「用过之后」那段(屏幕上在,打印或存 PDF 时自动隐去)。交付时说一次就行:要是哪条她真照着拍了、下次真的不一样了,回来说一句。说完就过——不重复、不催、不说"求好评""给个星",也不拿它当交换条件。这段是给反馈留个落点,不是营销位。
Step 8 · 要不要把批注画回照片(用户说「圈出来 / 标一下」时给)
打分卡是"报告",批注图是"指给你看"。只在下面两种情况下给批注图,不要每张都出:
- 用户明确说「圈出来 / 标一下哪里不对 / 帮我在这张上指出」;
- 问题位置说不清楚、非画不可(比如"头顶贴边""主体和背景糊在一起""地平线歪了")。
一条铁规矩:只在原图上画标注,不修画面。 不磨皮、不换天、不拉直、不做 AI 重绘 —— 这是"圈出来给你看",不是修图。用户要修图,明确告诉他这超出本技能范围。
画法:写一个 spec JSON(坐标全用 0~1 相对值,换分辨率不用改),然后跑脚本:
python scripts/annotate.py spec.json
{
"photo": "原图路径.jpg",
"out": "输出路径.png",
"headline": {"score": 6.4, "text": "光对了,头部留白太少"},
"scale": "按【人像】标准",
"grid": "thirds",
"marks": [
{"type": "box", "x": 0.12, "y": 0.08, "w": 0.62, "h": 0.86, "label": "头顶快贴边,往上留一拳头", "tone": "warn"},
{"type": "line", "x1": 0.06, "y1": 0.02, "x2": 0.94, "y2": 0.02, "label": "这一条是安全边", "tone": "info"},
{"type": "point", "x": 0.46, "y": 0.22, "label": "对焦点该在眼睛", "tone": "info"},
{"type": "arrow", "x1": 0.80, "y1": 0.75, "x2": 0.62, "y2": 0.60, "label": "往后退半步,背景就松开了", "tone": "fix"}
],
"footer": "先修【当场可改】:头顶留白 → 对焦 → 背景。"
}
| 字段 | 取值 | 说明 |
|---|---|---|
type |
box / arrow / line / point / text |
框、箭头、参考线、对焦点、纯文字标签 |
tone |
bad 红 / warn 橙 / fix 绿 / info 青 |
颜色跟着归因层走:一层问题用 bad,二层用 warn,怎么修用 fix,参考线用 info |
label |
一句话 | 写"改什么、怎么改",不写"构图不好"——和 Step 5 同一条标准 |
grid |
thirds / golden / center / none |
构图参考线 |
footer |
一句话 | 底部结论,通常就是"先修哪一层" |
批注数量上限 5 条。 圈太多等于没圈 —— 用户只记得住最先看到的那两条。
> 这条现在由脚本兜住(1.2.4 起):marks 超过 5 条时 annotate.py 只画前 5 条,
> 并把丢掉的那几条打印出来(! marks 有 7 条,超过上限 5,已只画前 5 条(丢弃:…))。
> 所以写 spec 时按重要性排序——第 6 条起不会被画,也不会报错,只会被丢弃。
> 想确认丢掉了哪些,先跑 python annotate.py <spec.json> --demo,它会告诉你「超过上限 5 条」。
> 脚本需要 PIL,用这个解释器跑:C:\Users\zhang\.workbuddy\binaries\python\envs\default\Scripts\python.exe
> 包里没有照片(平台不收图片),冒烟测试用 --demo-out demo.png 的合成占位图。
模式 B · 拍前指导
用户问"什么时候去拍/怎么拍好看"而没发照片时,不打分,改用 references/shooting-playbook.md:
- 光线时段——具体几点到几点、为什么这个时段好(用 playbook 第一节表)
- 光位——让被拍者站在哪(第二节)
- 机位与构图——站在哪、主体放画面哪个位置(第三/四节)
- 要抓的瞬间——预判 2–3 个好瞬间,快门什么时候按(第六节)
- 手机设置——只说必要的(第五节)
- 天气兜底——如果阴天/下雨/起雾,改拍什么(第七节)
结尾给"这次只练一件事"——一次出门只带一个目标。
HTML 打分卡
数据格式
写一个 JSON(存到工作目录),字段:
{
"score": 6.4,
"tagline": "一张光线对了但没等瞬间的照片",
"dims": [
{"name": "光线", "score": 8.0, "note": "侧光有层次,脸是立体的", "layer": "lost"},
{"name": "瞬间与情绪", "score": 5.2, "note": "表情中性,没抓到互动", "layer": "lost"},
{"name": "构图与画面结构", "score": 6.0, "note": "主体居中,背景右侧有杂物", "layer": "live"}
],
"assets": ["...", "..."],
"fixes": [
{"t": "当场可改", "h": "让主体和背景分开", "p": "往后走一步", "a": "别用长焦硬拉"}
],
"quip": "光线这次赢了,下次等那个笑。"
}
必填:score(0-10)、tagline、dims(数组,每项含 name/score/note/layer)、assets、fixes、quip。
layer:lost(机不可失)/live(当场可改)/post(后期能救)—— 用于卡片归因分布图。fixes的t用中文标签:机不可失/当场可改/后期能救。- 只把有话说的维度放进
dims(低于 7 分或明显有优点的),不必凑满七个。
生成命令
python scripts/make_card.py <data.json> <输出路径.html>
- 用有 PIL 的解释器跑(若脚本需要):
C:\Users\zhang\.workbuddy\binaries\python\envs\default\Scripts\python.exe - 脚本会自动做冒烟测试,检查渲染有无 NaN/undefined、区块数量是否对。
- 生成后用 present_files 展示 HTML。
核心纪律(必须遵守)
- 不为客气抬分。 普通随手拍 5–6.5 是真实分布。抬到 7+ 是误导。
- 技术硬伤不商量。 糊、切头顶切关节、天空死白、背景穿头——直接扣,不找补。品味/风格(正中央构图、暖色调)不是错误,不扣分。
- 区分"看不清"和"被遮挡"。 前者给保守分,后者才标不可评。
- 换题材必须换权重并声明。 拿自拍分和风光分直接比是最容易犯的错。
- 不评人长相。 这个技能只评照片。用户要评颜值 → 建议用 look-score 技能。
- 建议必须可迁移。 写"下次怎么做",不写"建议加强构图"。
- 别让人觉得"我以后也拍不好"。 把"这张的问题"和"下次怎么办"分开说;一张难看通常是没等光/没等瞬间,不是能力问题。
- 读不了图就说读不了。 绝不假装看过照片。
- 批注不是修图。 画标注只用来"指出问题",不改画面本身;换天、磨皮、拉直、AI 重绘一律不做——那是另一个技能的活。
- 反馈入口只说一次。 卡片末尾有「用过之后」,交付时点一句即可。反复求评价、说成"求好评""给个五星"、或拿它换东西,都会让这条唯一的回话通道作废。
资源
references/scoring-rubric.md——评分锚点表、七维度档位、题材权重、三层归因、降级规则(评分前必读第七节)references/shooting-playbook.md——拍前指导手册(模式 B 必读)scripts/make_card.py——HTML 打分卡生成器 + 冒烟测试scripts/annotate.py——批注图生成器(把参考线/主体框/对焦点/箭头/标签画回原照片;--demo-out可无照片冒烟)templates/score-card.html——打分卡模板