本文へ移動
cccskills
無料GitHub で公開

photo-spread-composer

当使用者说"把这些照片排成一版"、"做一张照片展示海报"、"仿报纸摄影版那种排版"、"这组照片怎么摆"、"做个 photo essay 的版面"时使用。

输入一组照片加署名,分两步:先产出 spread-plan.md(分带、定主次、排序、每带的图注与署名、被舍弃的照片及原因),等确认后再产出单文件 spread.html(照片按需缩放并内联,可打印成 PDF)。这个 skill 不提供固定版式——它给的是带状构图的语法与协议,具体谁大谁小、分几带、怎么排由模型和使用者判断。

每张照片必须有署名,分辨率不足会被拦下。只想把自己拍的 3–9 张按原顺序拼成一张长图、网格或一页 PDF,不要分带主次和署名时,用 photo-series-layout。

インストール方法を見る

含まれるファイル(19)

  • SKILL.md14.2 KB
  • examples/example-plan.json2.2 KB
  • examples/example-plan.md2.4 KB
  • examples/example-spread.html118.5 KB
  • examples/photos/sq1.jpg16.1 KB
  • examples/photos/sq2.jpg16.1 KB
  • examples/photos/tall1.jpg10.4 KB
  • examples/photos/tall2.jpg9.8 KB
  • examples/photos/wide1.jpg12.8 KB
  • examples/photos/wide2.jpg11.0 KB
  • examples/photos/wide3.jpg12.7 KB
  • examples/photos/wide4.jpg11.4 KB
  • README.md3.5 KB
  • references/layout-grammar.md4.0 KB
  • scripts/build_spread.py26.7 KB
  • scripts/image_io.py32.9 KB
  • scripts/measure_photos.py10.6 KB
  • templates/spread-plan.md2.2 KB
  • templates/spread.html5.6 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

照片版面 / Photo Spread Composer

把一组照片排成报纸摄影版那样的展示版面:分带、定主次、justify 到版心两边齐平。

这个 skill 不给版式,给语法

最重要的一条:不要把位置写死。

一张好的照片版面,谁占最大格、分几带、哪张打头,取决于这一组照片本身—— 哪张有决定性瞬间、哪张的留白能接住图注、哪两张放一起会打架。这些是每次都不同的判断, 写成模板就等于把判断替使用者做了,而且做错的概率是百分之百。

所以这里给的是:

  • 协议(Protocol):数据契约、两个阶段、产出契约。这部分是死的,可被脚本校验
  • 语法(Conventions):让版面成立的不变量。带怎么构成、图注归谁、层级靠什么建立
  • 留给判断的:分几带、谁是主角、怎么排序、裁不裁、强调色用什么。这些必须现场决定

下面第三节专门列了"留给判断的"清单。看到那节里的项目,不要去别处找标准答案,就地判断。

何时使用 / When to use

  • 手上有一组照片(活动记录、专题、日常)要排成一版展示
  • 要做摄影墙、社团刊物的摄影版、影展前言页
  • 已有一版要调主次或换页面尺寸

不适用于 / Not for:

  • 单张照片:写图注或作品说明 → 用 photo-caption-writer;加拍摄参数边框 → 用 photo-exif-frame;做成极简几何海报 → 用 photo-poster-stylist
  • 自己拍的 3–9 张,只想按原顺序拼成一张长图、网格或一页 PDF,不要分带主次、不逐带署名 → 用 photo-series-layout。 反过来,要刊物或展板那样分带、定主次、每带带署名的版面,或者照片超过 9 张,才用这个 skill
  • 产品卖点或研究结果收成一张总结图 → 用 bento-infographic
  • 整套演示 → 用 keynote-deck-builder
  • 要修图、调色、批量处理 → 这个 skill 只排版,不改动照片内容

输入 / Inputs

输入必填说明
照片文件是目录或路径清单。先跑 measure_photos.py 量一遍
署名是每张或每组的拍摄者。没有署名不上版,见边界
每带一句说明是这一带拍的是什么。写不出来说明这几张不该在一起
页面尺寸否默认 A3 纵向 297×420mm。海报可给 A2,刊物给 A4
刊头信息否栏目名、期号、页码。不要用真实出版物的报头,见边界
强调色否不给就问,或按照片主色定

脚本依赖:Python 3 和 Pillow(python3 -m pip install Pillow)。scripts/image_io.py 是和摄影类 skill 共用的读图模块, 要和两个脚本放在同一个目录。

HEIC(iPhone 默认格式)要装 pillow-heif 才读得了。没装时先转一份 JPEG: sips -s format jpeg IMG_0001.HEIC --out IMG_0001.jpg(macOS 自带,保留 EXIF),plan 里写转出来的文件名。 两个脚本遇到 HEIC 都会报出这条命令,不会静默跳过。

只有两件事需要问,其余从材料读:

  1. 给谁看、挂在哪(打印张贴 / 刊物内页 / 屏幕浏览)——这决定页面尺寸与最小复制尺寸
  2. 有没有必须上版的照片,或必须回避的人物与场景

协议 / Protocol

这一节是死的。脚本按这个契约工作,不要改结构。

阶段一:spread-plan.md

用 templates/spread-plan.md 起草。这一步不写任何 HTML,不生成 JSON。

写完停下等确认。哪张照片当主角是整件事里最需要使用者拍板的判断, 一步做到底等于把它藏进 HTML 里。

阶段二:plan.json + spread.html

确认之后把计划翻译成 plan.json,跑脚本产出 HTML。

plan.json 的数据契约:

{
  "page":  { "width_mm": 297, "height_mm": 420, "margin_mm": 18,
             "gutter_mm": 3, "dpi": 300 },
  "bands": [
    { "caption": "这一带拍的是什么",
      "credit":  "摄影:某某、某某",
      "items": [
        { "type": "photo", "src": "a.jpg" },
        { "type": "stack", "src": ["b.jpg", "c.jpg"] },
        { "type": "text",  "width_mm": 38, "title": "…", "byline": "…", "body": "…" }
      ] }
  ]
}

三种 item,够表达这一类版面的全部结构:

type是什么宽度怎么定
photo一张照片由长宽比与带高解出
stack竖向叠放的一组,共用一个宽度由组内各图长宽比与带高解出
text文字栏(作品自述、创作说明)固定 width_mm

带高是解出来的,不是拍出来的

一带之内所有 item 等高、左右顶到版心边缘。给定版心宽 W、天沟 g、 n 个 item,带高 h 由这个方程唯一确定:

h · [ Σ aᵢ + Σ 1/Sⱼ ] = W − (n−1)·g − Σ wₖ + Σ (mⱼ−1)·g / Sⱼ

  aᵢ   photo 的长宽比(宽/高)
  Sⱼ   stack 内各图 1/长宽比 之和,mⱼ 为该 stack 的图数
  wₖ   text 栏的固定宽度

这是这套版面唯一的硬约束。 其余全是判断。 build_spread.py 解这个方程,所以你永远不需要手写任何一个位置或尺寸。

产出契约

  • 单文件 HTML,照片按实际显示尺寸缩放后内联为 base64,离线打开完全一致
  • @page 按 plan.json 的页面尺寸设置,浏览器打印即得正确开本的 PDF
  • 分辨率不足的照片不会被静默放大,脚本报错并列出缺多少像素
  • 照片先按 EXIF 方向转正再量、再缩放:手机竖拍按竖图算带高,内联后也是竖的
  • 每张内联照片保留自己的 ICC 配置文件(iPhone 的 Display P3 仍标 Display P3,浏览器显示和打印成 PDF 都按它解释); 没有配置文件的标成 sRGB,灰度与 CMYK 配置文件转成 sRGB;透明区域铺纸色。脚本最后一行"色彩:"报告每种处理各几张
  • plan.json 里写错的键、非数字的尺寸会直接报错,不会被静默忽略

版面语法 / Conventions

让这类版面成立的不变量。违反这些,做出来就不是这个东西了; 在这些之内,怎么排都对。

G1 带状堆叠。 版面是若干横带自上而下堆叠;一带之内横向排列、等高、两端顶齐。 不要做成瀑布流或自由拼贴——两端顶齐是这类版面的骨架。

G2 一带一主角。 每带里应当有一个 item 面积明显最大。 三张一样大的照片摆一排,这一带就没有主语。(哪一张当主角是判断,见下一节。)

G3 层级只靠面积。 不加边框、不加阴影、不加圆角、不加白边。 照片之间只有天沟。想强调就给更大的面积,不要靠装饰。

G4 天沟恒定。 全页一个天沟值,横竖相同。带与带之间的间距等于天沟, 或等于天沟的整数倍——不要每处都不一样。

G5 图注归带不归张。 图注贴在它所描述的那一带下方、左对齐,小字号。 一带里若干张照片共用一条图注,说明它们是一组;说不出这组共同讲什么, 就该拆成两带。

G6 署名必留。 每带带署名。多人拍摄按出现顺序列。 署名是事实不是装饰,不能因为版面挤就删掉。

G7 一支强调色。 强调色只给栏目名与大标题,图注与正文用黑。 照片本身已经提供全部色彩,版面再上色就是打架。

G8 文字栏入列。 作品自述这类文字栏是带内的一个 item,与照片等高, 按同一套天沟对齐。不要让文字浮在照片上或压边。

G9 页面家具要轻。 页码、栏目名、期号排在顶部一条细线上下,小字号。 它们是坐标不是内容。

G10 顶到版心。 所有带左右都顶到版心边缘。 不要让某一带比别的窄一截——那看起来像没排完。


留给判断的 / Left to judgment

看到这一节里的项目,就地判断,不要去找标准答案。 这个 skill 故意不给这些的默认值,因为它们由这一组照片决定。

判断项判断依据
分几带、每带几张内容能不能归成一句话。一带一个主题
哪张当主角哪张信息最完整、瞬间最强、或留白最能接住图注
带的顺序通常强的打头、强的收尾,中间给密度。也可以按时间或叙事排
裁不裁、裁成什么比例裁掉的必须是真的没用的部分。裁法要写进 plan
用不用 stack有一张竖构图想占两带高度时用
要不要文字栏有作品自述或需要展开说明时用
强调色照片的共同色调、场合、或使用者指定
字号级差标题与图注拉开三档以上即可,具体值自己定
页面尺寸由"挂在哪"决定

两条判断上的经验,是提示不是规则:

  • 相邻两张构图方向相同(都往右冲)会互相抵消,错开或换序
  • 人脸朝向最好朝向版心内侧,朝外会把视线带出版面

分辨率与印刷

build_spread.py 会按解出的显示尺寸算每张照片需要多少像素:

需要的像素宽 = 显示宽度(mm) ÷ 25.4 × dpi
  • 打印默认 dpi: 300。屏幕浏览可降到 150
  • 不足就报错,不静默放大。 放大后打印出来是糊的,而使用者在屏幕上看不出来
  • 通过的照片会被缩到实际需要的尺寸再内联,所以成品文件不会因为塞了原图而爆掉

事实与署名 / Credits and captions

  1. 每张照片都要有署名。 查不到作者的照片不上版,不写"佚名"蒙混
  2. 图注只写看得见的事。 时间、地点、事件、人物,都要有出处; 不确定的写不确定,不要为了句子顺就补细节
  3. 不替照片编故事。 "队员们在赛后相拥"可以,"队员们为失利而落泪"不行—— 除非使用者确认当时确实如此
  4. 人物可辨识时先问。 尤其是未成年人、非公开场合、以及会让当事人难堪的画面
  5. 裁切要记录。 改变长宽比会改变内容的含义,plan 里写清楚裁了哪边

边界 / Boundaries

  • 不用没有授权的照片。 只排使用者自己拍的或明确有权使用的。 网上找图、截取他人作品一律拒绝
  • 不去水印、不抹署名、不裁掉角落的作者标记
  • 不复制任何真实出版物的报头、刊名、商标或版式识别。 这类版面的语法(带状构图、图注惯例)是通用做法,可以借鉴; 但产出物不能让人误以为是某一家刊物的某一期。 使用者要求"做得跟某某报一模一样"时,做语法不做身份
  • 不编造署名、图注、日期或事件
  • 不修改照片内容:不调色、不合成、不移除画面里的东西。这个 skill 只排版
  • 不静默放大低分辨率照片
  • 不在阶段一就生成 HTML 或 JSON

输出格式 / Output

阶段一:

先按这组照片排了一版分带方案:

<spread-plan.md 全文>

**我拿不准的:**
- <哪张当主角的取舍>
- <被舍弃的照片及原因>

确认之后我生成 spread.html。

阶段二:

版面已生成:<文件路径>

- 页面:<尺寸>,<n> 带,共 <m> 张
- 主次:<每带的主角是哪张>
- 分辨率:全部通过 / <哪几张不足,缺多少>
- 未用:<没上版的照片及原因>
- 导 PDF:浏览器打开后 Cmd+P,纸张选<尺寸>,边距选无,勾选背景图形

Token 控制 / Token discipline

  • 先跑 measure_photos.py 拿长宽比与像素,不要把照片本身读进上下文
  • 阶段二只读 plan 和模板
  • 调整某一带就改 plan.json 里那一带重跑,不重新规划整版

参考资料 / References

  • references/layout-grammar.md —— 语法逐条的来由,以及带高方程的推导
  • templates/spread-plan.md —— 阶段一骨架
  • templates/spread.html —— 版面语法的 CSS 实现(没有任何写死的位置)
  • scripts/measure_photos.py —— 量长宽比、像素、EXIF 署名,标出不可用的
  • scripts/build_spread.py —— 解带高方程、查分辨率、缩放内联、出 HTML
  • scripts/image_io.py —— 与摄影类 skill 共用的读图模块(EXIF 方向、ICC、HEIC 提示)。各副本逐字节相同,不要只改这一份

三个脚本都有 --selftest,改动后先跑一遍。

变更记录 / Changelog

版本日期变更类型
0.1.22026-10-10分流改指 bento-infographic(launch-summary-panel 已废弃)patch
0.1.12026-09-26脚本改走共用 image_io:按 EXIF 方向转正(竖拍不再横躺、带高不再按横图算),保留 ICC、透明铺纸色,HEIC 与缺图给出可读提示;修模板注释里的占位字面量导致整版照片注入两次;改用 argparse 并补 --selftest;单张照片改指 photo-caption-writer / photo-exif-frame / photo-poster-stylist,补与 photo-series-layout 的判别句;注明 Pillow 依赖patch
0.1.02026-08-21初始草稿。协议与语法分离,位置全部由带高方程解出,主次与分带留给判断minor

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

当学生说"Common App 活动栏写不下"、"这段活动描述超字数了"、"帮我把这几条压到限制内"时使用。先按官方申请表核对当季字符限额,再逐条检查;一次把所有条目量完并直接给出压缩版,只在需要砍掉实质内容时才用选择题问该保哪部分。每改一版都用工具重新数一遍字符,绝不凭感觉说"这样应该够了"。只压缩,不代写空白。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当学生说"我参加过一些活动但没整理过"、"帮我把经历录进去"、"我的活动档案是空的"时使用。让学生一口气把记得的活动说出来,直接把这段话拆成结构化的长期事项(角色、组织、起止时间、做了什么、结果、级别),说不清的字段留空标"待补"而不是编,再用一张选择题卡把级别判定与是否重复这类关键项一次问完,然后提案入库。只记录学生真正说出口的内容,级别按事实判定,绝不往高了写。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当学生问"招生官会怎么看我的档案"、"我的背景还差什么"、"帮我评估一下现在的申请竞争力"时使用。以顶尖大学招生官的视角通读学生的档案、长期活动与已写下的反思,不问任何前置问题直接产出一份指名道姓的坦诚点评:这份材料的亮点、招生官真实的解读方式、明显的短板与空白、以及接下来最值得做的一到两件事。只读不写,不修改学生的任何数据,也不代写任何申请材料。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当使用者说"帮我填词"、"按这个字数模板写歌词"、"用多Agent对抗式写词"、"这首副歌帮我想几句"时使用,前提是字数骨架和这首歌写什么都已经有了;只有主题、还没定写什么时先用 lyric-concept-builder。拿一份字数骨架和意象系统,派三个 sonnet 子代理按不同路子并行独立起草(场景派 / 口语派 / 意象派),再派一个红队子代理逐句挑毛病,主 Agent 按句裁决拼稿,最后统一辙口与意象。收敛判据卡死:字数用 lyric-doctor 的脚本对模板数、每段同辙、hook 不含陈词、主歌二对主歌一有推进。不抄现有歌词,不替使用者决定这首歌要说什么。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当想知道一段 AI 回答"哪些能直接用、哪些必须先验证、哪些只能当建议"时使用。按声明类型分四级——低风险草稿材料、观点与策略建议、可查证的事实声明、会改变状态的可执行指令——每级配一句默认处置动作;再按影响半径排序,给出最小的下一步检查。可执行类一律标"不能直接执行;先做代码审阅/沙箱测试/回滚准备",其中破坏性或提权的命令排在最前。教的是一套可复用的复查习惯,不是替使用者把所有内容都核实一遍:本 skill 只分级、排序、定处置,要逐条核实走 ai-output-fact-checker,整段代码要做入库体检走 ai-code-onboarding-checklist。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当拿到一段 AI 生成的代码,还没决定要不要信、要不要跑、要不要往上继续加东西时使用。先做一遍客观体检:行数与嵌套深度、有没有测试、有没有硬编码密钥或遗留 TODO、依赖是不是真实存在、有没有危险调用(eval/exec、shell=True、递归删除、反序列化、提权、外发网络,按正文给的 grep 模式逐类查);再给风险评级和下一步动作。老实写明它查不了算法正确性——体检通过不等于代码是对的。回答里文字、事实和代码混在一起时先用 ai-answer-triage 分级;只审相对已有代码的一份改动用 ai-diff-review-protocol。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

ChromiteCr のスキルをすべて見る

このスキルの問題を報告する