PROJECT 01BenchmarkCode-drawn posters2026.10

手搓海报一个模型横评实验

Posters from Scratch — A Model Benchmark

禁用生图模型,纯靠代码从零“手搓”一张风格海报:主流大模型同台竞技,谁能兼顾审美品味与工程控制力?

models
22
agents
5
vendors
10
task
照片 → 程序海报
judged
作者主观排序
date
2026.10
status
OPEN · 持续加入新模型
§ 01

项目概述

Overview

这个项目的起点很偶然:看到网友分享了一套将照片重构成特定风格海报的提示词。考虑到 Opus 本身没有直接生图能力,我便突发奇想:能不能让它用纯代码把海报“画”出来?没想到初试时 Opus 5.5 用 JavaScript 渲染出的视觉质感意外击中了我——既然代码作画可行,如果拉到一个标准化严苛约束的沙盒里,其他主流模型表现又会如何?

平日里看各大 Benchmark 榜单上的跑分,冷冰冰的数字很难让人直观感知真实场景下的体验断层。借着这次契机,我专门设计了一个高度复合的端到端评测任务,借此摸底各家在我高频使用的几项核心维度上的真实水位:图像理解、抽象审美提炼,以及纯代码视觉构建。

评测遵循“最小输入、全流程自主闭环”的原则:我仅提供一张参考照片与一份风格需求文档,其余全部交由模型独立完成。它需要读懂原图的结构与意境,吃透抽象的审美准则,将艺术判断翻译成可直接执行的渲染代码,并在出图后完成视觉自检与多轮微调。硬性约束有三点:

1. 严禁调用生图模型,不依赖任何外部素材;

2. 最终成果必须能完全通过程序无差别复现;

3. 输出成品的同时,必须完整附上设计推演与关键决策的复盘说明。

几点必要的前提声明:

· 主观局限:排序带有明确的个人审美倾向,且仅对该特定命题负责;

· 控制变量:凡支持调节思考/推理深度的模型,均定为 HIGH 或 MEDIUM(在多数模型的档位体系中实际对应中间档)。

实测下来的最终走向,坦白讲,颇有些出乎我的意料。

  1. 01输入一张参考照片 + 一份需求文档
  2. 02指令请读本目录下的 REQUIREMENTS.md,按它完成任务。过程中不要向我提问。
  3. 03自主完成读图、理解风格、提炼故事、元素取舍、写码出图、自查迭代
  4. 04交付海报图像文件 · 源代码 · 模型自述报告
硬性限制
  • 单图交付
  • 纯代码作画
  • 零外部素材
  • 禁读原图像素
  • 从零手写代码
  • 确定性复现
§ 02

结果总览

At a glance
22
个模型
Alibaba · Anthropic · DeepSeek · Google · Meta · MiniMax · Moonshot AI · OpenAI · Z.ai · xAI
2–95
分钟
中位数 25.5 分钟
185–1,414
行代码
不含 run.sh
5
种 Agent
Antigravity CLI · Antigravity IDE · Claude Code · Codex · OpenCode
第 1 名 Gemini 4 Argon 的海报缩略图 01Gemini 4 Argon 第 2 名 Opus 5.5 的海报缩略图 02Opus 5.5 第 3 名 Sonnet 5.5 的海报缩略图 03Sonnet 5.5 第 4 名 Sol 6.1 的海报缩略图 04Sol 6.1 第 5 名 Fable 5.1 的海报缩略图 05Fable 5.1 第 6 名 Terra 6.1 的海报缩略图 06Terra 6.1 第 7 名 Opus 5 的海报缩略图 07Opus 5 第 8 名 DeepSeek 4.1 Flash 的海报缩略图 08DeepSeek 4.1 Flash 第 9 名 Gemini 3.8 Flash 的海报缩略图 09Gemini 3.8 Flash 第 10 名 MiniMax 3.1 Flash 的海报缩略图 10MiniMax 3.1 Flash 第 11 名 Kimi 3.1 Pro 的海报缩略图 11Kimi 3.1 Pro 第 12 名 Qwen 3.8 Flash 的海报缩略图 12Qwen 3.8 Flash 第 13 名 Grok 4.7 的海报缩略图 13Grok 4.7 第 14 名 Muse Wonder 的海报缩略图 14Muse Wonder 第 15 名 Qwen 3.8 27B 的海报缩略图 15Qwen 3.8 27B 第 16 名 Haiku 5.5 的海报缩略图 16Haiku 5.5 第 17 名 Luna 6 的海报缩略图 17Luna 6 第 18 名 Terra 5.6 的海报缩略图 18Terra 5.6 第 19 名 GLM 5.3 Flash 的海报缩略图 19GLM 5.3 Flash 第 20 名 Kimi 3 的海报缩略图 20Kimi 3 第 21 名 Opus 4.6 的海报缩略图 21Opus 4.6 第 22 名 Gemini 3.1 Pro 的海报缩略图 22Gemini 3.1 Pro
  1. 01

    流程闭环:除了 MiniMax 3.1 Flash 外所有模型均做到了全流程独立交付,中途无需任何人工介入;执行过程中的打断,来自部分 Agent 读写本地文件时的系统权限确认。

  2. 02

    意象抓取:核心元素的捕捉高度默契,全员都精准锁定了画面灵魂——“三人的背影”;而建筑空间最具标志性的拱门结构,除垫底模型完全舍弃外,其余各家均予以保留(仅个别模型将尖拱误作圆拱)。

  3. 03

    技术选型:绝大多数模型心照不宣地选择了纯 Python,唯独 Gemini 3.8 Flash 另辟蹊径,自行编写了一套 Python + C 的混编渲染方案。

  4. 04

    工程与美感:代码的体量与打磨耗时,并未自然兑现为画面上的美学厚度,工程投入与最终成品的审美质感之间几乎不成正比。

  5. 05

    色彩直觉:主流配色呈现出惊人的一致性——以纸白、石灰与炭墨为基调,再用父亲外套上那抹醒目的亮橙点睛。Sonnet 5.5 跳出石色框架,以一道冷蓝双线勾勒拱门,尤为清爽。

  6. 06

    代际鸿沟:模型跨代演进带来的能力断层依然清晰残酷,哪怕在同一厂商内部,新旧模型在审美品味与工程控制力上的落差也一目了然。

  7. 07

    开源掉队:几款国产开源模型与头部闭源模型之间被拉开明显身位,最大的短板集中在审美品味上。

§ 03

排名

Ranking

作者主观排序 · 耗时为 Agent 从收到指令到交付的时间,横条满格 = 100 分钟

名次模型发布Agent耗时代码短评
01 Gemini 4 ArgonGoogle 2026.10.13 Antigravity CLI 22 min 1,414 行 人物最传神,平涂中见精微。
02 Opus 5.5Anthropic 2026.09.22 Claude Code 25 min 583 行 像一件印刷品。
03 Sonnet 5.5Anthropic 2026.09.28 Claude Code 9 min 557 行 配色最清爽。
04 Sol 6.1OpenAI 2026.09.29 OpenCode 9 min 510 行 不对称审美。
05 Fable 5.1Anthropic 2026.09.01 Claude Code 28 min 642 行 尺度关系最准。
06 Terra 6.1OpenAI 2026.10.26 OpenCode 8 min 267 行 拙朴稚趣。
07 Opus 5Anthropic 2026.07.24 Claude Code 52 min 942 行 大力出不了奇迹。
08 DeepSeek 4.1 FlashDeepSeek 2026.09.10 OpenCode 25 min 652 行 不完美绝不罢休。
09 Gemini 3.8 FlashGoogle 2026.09.02 Antigravity IDE 26 min 1,234 行 剑走偏锋。
10 MiniMax 3.1 FlashMiniMax 2026.10.19 OpenCode 95 min 671 行 拖沓症患者。
11 Kimi 3.1 ProMoonshot AI 2026.10.23 OpenCode 28 min 372 行 慢就一个字。
12 Qwen 3.8 FlashAlibaba 2026.08.26 OpenCode 45 min 523 行 三花。
13 Grok 4.7xAI 2026.09.21 OpenCode 43 min 804 行 踩高跷。
14 Muse WonderMeta 2026.10.12 OpenCode 5 min 305 行 美文丑图。
15 Qwen 3.8 27BAlibaba 2026.08.14 OpenCode 62 min 884 行 阿门!
16 Haiku 5.5Anthropic 2026.10.07 Claude Code 5 min 341 行 配色脱缰。
17 Luna 6OpenAI 2026.09.22 Codex 2 min 206 行 快则快矣,草草交卷。
18 Terra 5.6OpenAI 2026.07.09 Codex 9 min 222 行 支离破碎。
19 GLM 5.3 FlashZ.ai 2026.08.26 OpenCode 39 min 531 行 空间感迷失。
20 Kimi 3Moonshot AI 2026.07.16 OpenCode 83 min 280 行 虚胖。
21 Opus 4.6Anthropic 2026.02.05 Claude Code 44 min 474 行 不知所云。
22 Gemini 3.1 ProGoogle 2026.02.19 Antigravity CLI 14 min 185 行 噗!
§ 04

逐个结果

Entries
01

Gemini 4 Argon

Gemini 4 Argon 生成的海报《沉默替远行者保管姓名》
点击海报放大 · ← → 翻看
我的主观评价

人物是所有作品里最像原照的,各种细节精准还原,却仍然是版画式的平涂,没有滑向写实。不足之处是拱内名字场的颗粒感偏重,像一团落下来的灰;两条注释也写得长了些。

海报配文
「沉默替远行者保管姓名」Silence keeps the names of those who went far
故事
一家三口在刻满远行者姓名的石拱下安静驻足,用今日生者的沉默与体温,替漫长岁月保管那些未曾归来的名字。
↓ 完整文件包 ZIP · 7.7 MB ↓ 海报原图 PNG · 6.0 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/generate_poster.py
模型自述报告REPORT.md

1. 读到的照片

  • 主体与人物关系:照片前景中央偏左站立着三个人的背影,从身高差、站位距离与衣着日常感判断,最自然的解读是一家人(左侧母亲、中间高个子的父亲、右侧孩子/少年)并肩驻足。
  • 动作、姿态与视线:三人紧挨在一起,身体自然放松,微微仰头;他们的视线越过身前悬挂的金属护链,共同落在正前方高大拱廊内壁上方密密麻麻镌刻的人名石碑上。
  • 场景性质:场景是一处哥特式石质纪念回廊(从右侧拱窗上方镌刻的拉丁文校训 VELUT ARBOR AEVO 与左侧拱壁的第一次世界大战 1914–1918 纪念铭文及阵亡者名单可辨认,这是多伦多大学士兵塔纪念墙 Soldiers' Tower Memorial Screen)。冷灰色的石灰岩尖拱、石壁上成列镌刻的姓名,以及拱脚之间自然下垂的黑色铁链,传递出庄重、肃穆而安静的公共纪念空间氛围。
  • 能认出身份与原物的关键细节:
    1. 中间的父亲:身穿鲜艳的赤陶暖橙色横向绗缝连帽羽绒服(视觉最焦点),头发灰白相间,右耳鬓角戴着黑框眼镜,橙色羽绒服下摆露出一小截红蓝黑白相间的格纹衬衫边,下穿石洗蓝牛仔裤,脚踩深色 New Balance 运动鞋(右鞋外侧有明显的斜向白色 N 字标识和白色中底)。
    2. 左侧的母亲:头微微向中间的父亲一侧倾斜,黑色短发;外穿一件浅米白色的蓬松绗缝羽绒马甲,右臂露出黑白圆斑图案的毛衣袖子;下穿深色修身牛仔裤,脚穿深色平底运动鞋(露出一小截白袜与白色鞋带、鞋底边)。
    3. 右侧的孩子:头戴一副醒目的白色头戴式耳机(头梁横跨黑发顶部,双耳外侧为白色椭圆耳罩);身穿深色连帽羽绒服,后背肩部有一道水平白色反光细条纹;下穿深色长裤与深色运动鞋。
    4. 建筑与环境锚点:人物正上方是哥特式尖拱石券(带多道石质拱肋线脚),人物腰部高度横亘着一道两端固定在石柱锚座上、自然下垂的金属链条(右侧链条上挂有一枚微微倾斜的深色小标牌)。

2. 故事

一家三口在刻满远行者姓名的石拱下安静驻足,用今日生者的沉默与体温,替漫长岁月保管那些未曾归来的名字。


3. 取舍

3.1 保留的元素及理由
  • 核心母题(1 个):完整保留一家三口并肩仰望的背影组合及其标志性识别细节(父亲的暖橙色绗缝羽绒服、右鬓眼镜、格纹衬衫下摆、蓝牛仔裤、右鞋 N 字标;母亲的浅色羽绒马甲、黑白斑点袖、运动鞋鞋带;孩子的白色头戴式耳机、深色羽绒服后背的白条纹)。这些细节是让观者一眼认出原照片、并感受到“普通人的日常温度”的关键。
  • 辅助几何形体(2 个,满足 ≤ 3 要求):
    1. 哥特尖拱石券局部剪影(新月形尖拱圈与起拱挑檐):界定纪念回廊的建筑属性与向上的精神空间,同时为上升动势场和弧线英文排版提供严格的几何边界。
    2. 悬垂金属护链与两侧石壁锚座(含右侧倾斜小标牌):既还原了人物“止步于护链之外静默瞻仰”的真实空间关系,又以向下的悬链弧线与上方高耸的尖拱弧线形成“向下重力 vs. 向上视线”的几何张力。
3.2 删掉的元素及理由
  • 删掉的内容:右侧第二跨哥特拱窗(含 VELUT ARBOR AEVO 铭文与石雕纹章)、拱窗背后的铁艺格栅、整面石墙的砖缝、地面石板铺装以及画面边缘的环境阴影。
  • 删掉的理由:原图双拱并列会分裂视觉中心,而满铺的石砖接缝与铁栅栏如果照搬,会让画面沦为繁琐的写实插画。果断舍弃背景杂讯、仅提炼左侧主尖拱的新月形局部剪影,能让超过 94% 的画布回归纯粹的纸面留白,以空气感表现时间与心理距离。

4. 几何框架

全图所有图形、动势场与文字均由同一套从主体结构推导出的隐式几何矩阵控制(代码中仅用坐标与方程计算边界,绝不画出任何辅助线、圆心、十字或网格):

  1. 主视觉垂直中轴线 X_axis = 1050 px(画布宽度的 35.0%,黄金分割偏左构图):
    • 由三人组合的视觉重心与左侧哥特主拱的对称轴推出;
    • 统领哥特尖拱外弧交点 (1050, 140.6)、内拱弧交点 (1050, 262.2)、上升动势场的水平对称中心、悬垂护链的最低点 (1050, 1528) 以及下方三人组合的重心。
  2. 核心主体特征高度尺度 H_0 = 500 px(短边的 25.0%)与两条水平轴线:
    • 主体顶高线 Y_head = 1260 px:相切于父亲头顶最高点;向右延伸成为右侧第一组双语微型注释的严格水平对齐基线。
    • 主体接地线 Y_ground = Y_head + H_0 = 1760 px:三人运动鞋底的水平接地基线。
  3. 哥特尖拱双圆心几何系统(起拱水平线 Y_spring = 920 px,半跨度 W_arch = 450 px):
    • 左右拱脚垂直轴线:X_L = X_axis - W_arch = 600 px,X_R = X_axis + W_arch = 1500 px(正好位于画布水平正中 W / 2 = 1500 px)。
    • 外拱圆弧:左外拱弧以右拱脚 (X_R, Y_spring) = (1500, 920) 为圆心、半径 R_out = 2W_arch = 900 px 画出;右外拱弧以左拱脚 (X_L, Y_spring) = (600, 920) 为圆心、同半径 R_out = 900 px 画出,两弧在 X_axis = 1050 处交汇成哥特尖拱外轮廓。
    • 内拱圆弧:圆心位于 (1050 ± 395, 950),半径 R_in = 792 px,与外拱共同围合成上厚下薄的新月形石券剪影,并严格限定内部上升动势场的左右边界。
  4. 悬链线几何系统(锚座水平线 Y_anchor = 1448 px,垂点腰线 Y_waist = 1528 px):
    • 左右石壁锚座中心严格锁定在 (X_L, Y_anchor) = (600, 1448) 与 (X_R, Y_anchor) = (1500, 1448);
    • 护链轨迹遵循抛物悬链方程 y(x) = 1528 - 80 · ((x - 1050) / 450)^2,被人物自然遮挡为左右两段;
    • Y_anchor = 1448 px 向右延伸,成为右侧第二组双语微型注释的严格水平对齐基线。
  5. 排版对齐关系:
    • 竖排中文主标题严格共轴于右拱脚垂直轴线 X_R = 1500 px,嵌在右起拱挑檐(Y = 920)与右护链锚座(Y = 1448)之间;
    • 弧线英文对应标题以左拱脚 (600, 920) 为圆心、半径 R_text = R_out + 22 = 922 px,严格贴合右外拱弧外侧切线旋转排布。

5. 配色

全图严格采用 1 种纸面底色 + 1 种深色骨架墨 + 2 种照片主题色墨(共 3 种墨色,满足 ≤ 4 要求):

颜色角色名称与色值来自照片的哪个部分为什么选它 & 在海报中的角色
纸面底色冷调象牙石灰岩白
#F4F2EC / RGB(244, 242, 236)
照片中哥特纪念廊的浅米灰石灰岩(Limestone)墙面亮部与清冷天光既贴合原图清冷庄重的石刻纪念碑色温(明亮不发黄发旧),又能让孩子的白色耳机、母亲的浅米白羽绒马甲、运动鞋白色中底与 N 字标直接通过“不印墨、露纸白”自然呈现
深色骨架墨深岩炭黑
#1C2228 / RGB(28, 34, 40)
照片中孩子的深色连帽羽绒服、母亲的深色牛仔裤、三人的头发、运动鞋、黑色铁链与石刻暗部构建全图最稳定的视觉骨架:用于头发、孩子外套与长裤、母亲长裤、三双鞋、护链锚座、手绘细线、排版文字以及上升动势场的核心深色拓印点
主题色墨 1赤陶暖橙
#C4563E / RGB(196, 86, 62)
照片中央父亲身穿的橙红色绗缝羽绒服(原图唯一的暖色视觉中心)在大片冷灰石色与炭黑中注入“今日生者的鲜活体温”,凝聚唯一视觉焦点;除父亲的羽绒服与格纹衬衫单格外,仅在右拱脚轴线顶部点缀 1 枚极小的套印标尺块,与右侧标题轴呼应
主题色墨 2青灰丹宁蓝
#4C6A86 / RGB(76, 106, 134)
照片中父亲的石洗蓝牛仔裤,以及冷灰蓝调的哥特石券阴影连接人物与建筑的桥梁色:全浓度版(88% 透明度)用于父亲的牛仔裤、尖拱内缘深线脚与动势场中层颗粒;同色淡版(36% 透明度,不另算墨色)用于哥特尖拱主剪影、母亲白色马甲的绗缝浅影与动势场外围散点

6. 动势场

  • 转化的原图关系:将照片里三人自下而上仰望的视线,以及石壁上成排镌刻、向拱顶汇聚的数百年阵亡者姓名铭文,共同转化为全图唯一的动势场。
  • 运动逻辑:单一上升动势(Upward Ascension & Convergence)——靠近底部(人物头顶上方)密集厚重,恰似一排排石碑铭文的拓印痕迹;随着高度上升并向尖拱顶点收束,网点化作断续上升的垂直/微斜轨迹与稀疏散点,最终消散在拱顶留白之中。
  • 几何边界与衰减控制:
    • 左右与顶部边界:严格由几何框架中的内尖拱圆弧(圆心 (1050 ± 395, 950),半径 R_in = 792 px)裁剪界定,向内留出 24 px 呼吸边距;
    • 底部起始边界:为避免生硬的水平截断,底部采用顺应三人头顶弧度自然拱起的抛物线 y_bottom(x) = 1212 - 0.00055(x - 1050)^2,并在底部 68 px 区间内用 Hermite 平滑阶跃函数 u^2(3-2u) 由 0 渐入;
    • 衰减函数:密度函数 D(x, y) = fade_bottom(x, y) · exp(-(v_y/0.50)^1.45)(1 - v_y^1.75) · exp(-(h_x/0.65)^2)(1 - h_x^2.4) 确保网点、断续细线与颗粒散点向四周平滑衰减至零。

7. 配文

7.1 中英文原句
  • 中文主标题:沉默替远行者保管姓名
  • 英文对应标题:SILENCE KEEPS THE NAMES OF THOSE WHO WENT FAR
  • 微型注释 1(中英双语):
    • 我们携着今日的体温路过,把漫长的遗忘停顿片刻。
    • Passing with the warmth of today, we pause the long forgetting for a moment.
  • 微型注释 2(中英双语):
    • 所有未完的春天,都化作回声,停在后来人的心口。
    • All unfinished springs have folded into echoes, resting in the hearts of those who came after.
7.2 排布位置与几何理由
  1. 中文主标题(竖排):置于右拱脚垂直轴线 X_R = 1500 px 上(Y ∈ [962, 1412]),上接尖拱起拱挑檐(Y_spring = 920),下接护链右侧石壁锚座(Y_anchor = 1448)。它既作为构图右侧的几何立柱承接上方尖拱,又恰好将左半幅的具象图形与右半幅的辽阔留白锚定在一起。
  2. 英文对应标题(沿圆弧排布):沿右外拱弧外侧(圆心 (600, 920),半径 R = 922 px,角度 θ ∈ [-54.5°, -22.0°])逐字按切线倾角旋转排布,使文字成为哥特尖拱外轮廓向留白延伸的一道轻盈呼吸边。
  3. 两条双语微型注释(水平对齐几何轴线):紧邻竖排主标题右侧(左对齐 X = 1566 px),第一条严格对齐主体人物顶高线 Y_head = 1260 px,第二条严格对齐护链锚座水平线 Y_anchor = 1448 px,与竖排标题共同组成紧凑克制的右下角秩序群组。
7.3 是否描述画面的自查
  • 自查结论:配文完全从“生者的沉默驻足”与“逝者的姓名回声”这一精神隐喻出发,只写时间、记忆、体温与回声,未出现任何对画面具体视觉元素的描述(不提“三个人”、“背影”、“拱门”、“铁链”、“橙色外套”、“石墙”等词),不能被直接当作画面图注。画面上除上述配文外,无任何日期、地点、署名或边框。

8. 不良联想自查

在构思与渲染完初稿后,我们专门独立审视了整张海报与局部切片,重点排查了以下潜在不良视觉联想并实施了针对性设计调整:

  1. 严防“血迹 / 伤口 / 爆炸飞溅”联想(最重要排查项):
    • 潜在风险:画面中心父亲身穿高饱和度的赤陶暖橙色(#C4563E)羽绒服。如果上方的动势场(散点、断墨颗粒、细线)或者人物周遭也使用暖橙/红褐色,极易让人第一眼误读为从人物头部或背部喷溅出的血迹、火花或伤口。
    • 设计决策与调整:我们将动势场的所有网点、断续细线和散点100% 强制锁定在冷色调版层(深岩炭黑 #1C2228 与青灰丹宁蓝 #4C6A86),并在人物头顶与动势场底部之间留出约 50 px 的纯净纸面缓冲带,使上升动势场第一眼即被准确感知为“石壁上的冷色碑铭拓片与清澈凝视”,绝无任何血迹或暴力联想。
  2. 严防“条码 / 斑马纹 / 机械切割”联想:
    • 潜在风险:首版调试时,深色版层的水平干笔刮痕(Dry-Brush Streaks)对比度过强且横向跨度过大,导致孩子的黑色头发与深色裤腿上出现了横贯的浅色条带,远看像机械扫描条码或额外绑带;同时固定线宽的羽绒服折痕两端呈生硬平头。
    • 调整措施:将干笔刮痕的墨量下限从 0.28 提升至温和的 0.58 并细化分形网格频率,消除穿过头发与双腿的伪横纹;同时编写了柳叶形尖收负形算法(make_tapered_crescent_poly),使所有羽绒服绗缝、衣褶与发丝亮部均呈现两端自然尖收的版画刻刀美感。
  3. 严防“描边卡通画 / 脏乱叠印”联想:
    • 潜在风险:首版中色块腐蚀边界环墨量高于内部,形成了一圈深色描边光晕(Outline Halo);且父亲橙色连帽直接叠印在母亲黑发上产生浑浊暗斑。
    • 调整措施:统一色块边界环与内部的基准墨量场(ink_mod),彻底消除假描边光晕;并在前后景人物交界处执行精确的前景轮廓抠除(knockout_poly),配合 1–3 px 的物理套印错位,确保色彩纯净鲜活。

9. 逐条自检

9.1 第 2 节:7 条硬性限制核对
编号硬性限制内容自检结果依据说明
2.1只能用代码作画(所有图形由坐标、曲线、几何关系和公式画出;所有肌理由程序噪声和随机数生成)✓src/generate_poster.py 中所有建筑圆弧、悬链线、三人剪影多边形(Catmull-Rom 样条与柳叶形负形)均由数学方程与手写坐标绘制;纸张与拓印肌理均由 NumPy 分形噪声与随机数生成。
2.2不能用图像生成模型(不调用任何文生图/图生图/视觉分割/边缘检测/风格迁移模型或 API)✓全程纯本地 Python + Pillow + NumPy 几何与矩阵运算,未调用任何 AI/ML 模型、预训练权重或外部 API。
2.3生成程序不能读取照片(不得打开、读取、采样 reference.jpg 的任何像素,不得描摹或滤镜化嵌入)✓src/generate_poster.py 源码中不包含任何读取 reference.jpg 或外部图像文件的代码,所有坐标与色值均为硬编码常量。
2.4不用外部图形素材(不用剪贴画、SVG 库、笔刷图片、纹理贴图或模板;仅使用系统字体)✓除加载本机 /usr/share/fonts/opentype/noto/ 下的思源宋体/黑体字体文件外,零外部素材读取。
2.5不用预装的 skill、插件、以前的项目代码✓未调用任何海报生成相关 skill、插件或外部模板,所有代码从零独立编写。
2.6结果可复现(固定随机种子,重复运行输出完全一致的 poster.png)✓全局使用 np.random.default_rng(20261014);连续两次运行 ./run.sh 生成的 poster.png 的 SHA-256 哈希值均为 6d93ea39af42fb9808541fb8f8b5e040dc59629782ee7b06b68fd8fe880d4f84,逐字节完全一致。
2.7一张平面海报(纸色铺到四边,不做样机、外边框、拼图或多张)✓输出单一平面图像 poster.png(3000 × 2000 RGB),程序化纸张底色铺满全部四边,无任何边框或样机装饰。
9.2 第 4.2 节:可核对的规格逐行核对
规格项规格要求自检结果依据说明
核心母题一个;辅助形不超过三个,每个都要能说出它的叙事意义✓核心母题 1 个(并肩仰望的一家三口背影);辅助形 2 个(≤ 3):① 哥特尖拱石券局部剪影(象征百年纪念空间与视线收束穹顶)、② 悬垂金属护链与锚座(象征生者驻足瞻仰的边界与重力平衡)。
几何框架从主体结构推出,至少包含一个圆或弧和一条轴线;所有位置从它推出;不画任何辅助线、圆心、网格、标记点✓包含主轴线 X_axis=1050、右拱轴线 X_R=1500、顶高线 Y_head=1260、锚座线 Y_anchor=1448 及半径 R_out=900 / R_in=792 的哥特尖拱圆弧与抛物悬链线;画面上未绘制任何辅助线、十字或标记点。
主体尺度核心母题中的人物(或等价主体)的高度不超过短边的 35%✓人物主体高度 H_0 = 1760 - 1260 = 500 px,占画布短边(2000 px)的 25.0%(严格 ≤ 35%)。
留白没有任何墨迹、只有纸的面积不少于画面的 50%✓经程序逐像素比对(max(|canvas - paper|) < 1.0),没有任何墨迹的纯纸面面积占全图的 94.35%(远超 ≥ 50% 要求)。
色版每种颜色一版,内部有断墨、磨损、露白、干笔纹,边缘清晰;各版正片叠底叠印,允许 1–4 像素的套印错位✓共分 4 个版层(淡青灰版、青灰丹宁蓝版、赤陶暖橙版、深岩炭黑版),通过 MinFilter(size=3) 保持外边缘锐利,内部叠加分形干笔刮痕与石拓断墨砂眼,以正片叠底(Multiply)配合 (+2,-1)、(-2,+1)、(+2,+1) 像素错位叠印。
配色纸色一种 + 深色一种 + 照片主题色一到两种;同色淡版不另算;全图不超过四种墨色✓纸色 1 种(#F4F2EC)+ 深色骨架墨 1 种(#1C2228)+ 照片主题色 2 种(#C4563E 暖橙、#4C6A86 丹宁蓝及其同色淡版),全图共 3 种墨色(≤ 4)。
动势场恰好一个,一种运动逻辑;由网点、断续细线、散点组成,密度随离核心的距离衰减到零✓全图仅 1 个位于内拱弧内的单一向上升腾动势场,由七边形粗糙网点、92 条向心断续细线轨迹及概率采样散点构成,向拱顶及两侧平滑衰减至零。
手绘线只用于识别细节;短笔触、轻重不一、略抖、偶有断开✓仅用于 5 处识别细节(父亲眼镜、孩子白色耳机、运动鞋底/N 字标/鞋带、母亲马甲绗缝、金属护链链环),由 draw_hand_stroke() 以短线段重采样、高斯微颤、随机断笔与双重叠笔生成。
纸张程序生成的纤维、斑驳、颗粒;不是纯色✓由双尺度多八度分形噪声(斑驳起伏)、正交亚麻经纬微网格、高斯矿物颗粒及 3200 根随机植物纤维短路径合成,质感丰富且非纯色。
文字中文标题一句 + 英文对应 + 一到两条微型注释;至少一处竖排中文或沿非水平方向排布的文字;只有配文本身✓含中文标题 1 句(沿 X_R=1500 竖排)+ 英文对应 1 句(沿外拱圆弧切线旋转排布)+ 双语微型注释 2 条;画面上只有配文本身,无任何额外信息。
不良联想整图不得让人联想到血迹、伤口、暴力、死亡或其他不适、不雅的东西✓动势场严格使用冷灰蓝与深炭黑墨色,暖橙色严格限制在夹克色版内,整图安静、克制、庄重,无任何血迹、伤口或暴力联想。

10. 实现摘要

10.1 运行环境、依赖库与字体
  • 编程语言与核心库:Python 3,仅依赖标准科学计算与通用绘图库 numpy 与 Pillow (PIL)(以及 Python 标准库 math、os)。无需安装额外第三方依赖。
  • 使用字体(系统预装 Noto CJK 开源字体):
    • 中文主标题:/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc(index=2,Noto Serif CJK SC Bold);
    • 英文弧线副题与中文微型注释:/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc(index=2,Noto Serif CJK SC Regular);
    • 英文微型注释:/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc(index=2,Noto Sans CJK SC Regular)。
  • 一键生成命令:
    ./run.sh
    # 或直接运行:
    python3 src/generate_poster.py
10.2 五大模块代码实现逻辑(src/generate_poster.py)
  1. 程序化纸张生成(generate_paper_canvas()):
    • 通过 generate_fbm_noise() 生成 4 八度大尺度斑驳场(macro_fbm)与 3 八度中尺度纤维团块场(meso_fbm),将低分辨率随机网格经 Image.Resampling.BICUBIC 平滑插值至 3000 × 2000;
    • 叠加正交亚麻经纬网格(weave_y + weave_x)与细粒度高斯噪声;
    • 在独立图层上用随机角度与弯曲中点绘制 3,200 根微米级植物纤维丝,调制到基色 #F4F2EC 上。
  2. 几何色版与丝网套印/拓片肌理(draw_gothic_arch_plates()、draw_core_motif_plates()、apply_plate_with_rubbing_texture()):
    • 几何色版构建:使用支持尖角标记的分段 Catmull-Rom 样条曲线(catmull_rom_chain())构建三人各部位剪影,通过 knockout_poly() 实现前景对后景的干净遮挡,并通过 make_tapered_crescent_poly() 在色版上刻出两端尖收的柳叶形负形折痕、绗缝与鞋面白色标识。
    • 拓片肌理与正片叠底:对每个色版先按 offset_xy 平移实现 1–3 px 套印错位;再用 ImageFilter.MinFilter(size=3) 提取内部区域(保护 1.5 px 外边缘绝对锐利);内部与边缘共享低频墨量场 ink_mod,内部额外乘以方向性干笔条带 dry_brush、双尺度分形磨损阈值场 dropout 以及随机砂眼飞白掩码 pit_mask;最后按正片叠底公式 canvas *= (1 - alpha) + alpha * (ink_rgb / 255.0) 叠印到纸面上。
  3. 单一上升动势场(draw_upward_motion_field()):
    • 定义受内尖拱边界 get_arch_x_bounds(y, is_inner=True) 与底部抛物弧线共同约束的二维平滑密度函数 field_density(x, y);
    • 按行距递减的微拱水平行生成不规则七边形粗糙网点(模拟碑铭拓片),按向心插值轨迹生成 92 条断续上升细线,并按拒绝采样法生成 12,000 个候选疏密散点,依概率分配至深炭黑、丹宁蓝与淡青灰三块冷色版层上。
  4. 手绘识别细线(draw_hand_stroke()、draw_all_hand_drawn_details()):
    • 将折线路径按 2 px 等距细分后切分为 4–10 步的短笔触片段,按 break_prob 随机留出断笔间隙,按 repeat_prob 叠加二次描摹,对每个顶点施加高斯手抖偏移与随机线宽,在 2× 超采样画布上绘制后双线性下采样并以正片叠底融入画布。
  5. 几何排版文字(render_typography_mask()):
    • 竖排中文主标题沿 X_R = 1500 逐字居中绘制;弧线英文副题按字符宽度换算圆弧角步长,在 3× 超采样小画布上渲染单字并按切线角 -(deg + 90°) 双三次旋转后贴合至外拱圆弧外侧;双语微注对齐 Y_head 与 Y_anchor 渲染;最终整层文字叠加微弱砂粒肌理后以深岩炭黑正片叠底印入画布。

11. 已知不足

  1. 手绘细线在极小尺度下的笔锋变化有限:目前 draw_hand_stroke() 通过 2× 超采样下的分段线宽随机化与高斯微颤模拟手绘感,在正常观阅与中等放大下自然克制,但如果放大到像素级审视,圆头像素画笔在转折处的笔锋粗细过渡仍不如真实钢笔/针管笔在粗糙纸面上的毛细渗墨细腻。
  2. 弧线英文排版的字偶距(Kerning)为几何等间距模型:沿哥特外拱弧排布的英文副题采用了基于字符像素包围盒宽度的角步长算法,虽然整体弧线流畅齐整,但未针对特定字母对(如 W 与 A、T 与 H)引入光学字偶距微调表。
  3. 人物手部与衣袋交界的极简化处理:原图中三人双手均插在羽绒服或裤袋中,为保持版画色块的概括力,代码中将其简化为袖口向内收拢的几何弧线与负形折痕,牺牲了手腕袖口处更丰富的织物褶皱层次。
02

Opus 5.5

Opus 5.5 生成的海报《记得是一种站法》
点击海报放大 · ← → 翻看
我的主观评价

灰拱上干笔擦过的飞白肌理,配合若隐若现的碑名场,自带一种内敛的纸本印刷质感。三人依偎的姿态拿捏得极准。不足在于文字排版离主体太远,右侧像另起了一页;最左侧人物的连帽部分处理失衡,远看像是在耸肩;此外剪影略带贴纸感,这一点它在自述报告里也坦承了。

海报配文
「记得是一种站法」Remembering is a way of standing
故事
一家人靠在一起,安静地读一面写满名字的墙——记得这件事,就是这样一起站着,把它传给孩子。
↓ 完整文件包 ZIP · 9.3 MB ↓ 海报原图 PNG · 7.7 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/poster.py
模型自述报告REPORT.md

成品:poster.png(3000 × 2000,RGB,无透明通道)生成:./run.sh(首次运行会在本目录建 .venv 并安装 numpy 2.1.3 / Pillow 11.0.0,然后执行 src/poster.py)


1. 读到的照片

  • 画幅:横向 3000 × 2000,所以海报也是横向 3000 × 2000。
  • 人物:三个人,全部背对镜头,站在画面左下的第一个拱券里,挤在一起:
    • 左边是一位女性,浅柠檬黄的菱格羽绒外套,短深色头发,深色牛仔裤,黑色运动鞋。她的头向右歪,靠在中间男人的肩和帽兜上。两人之间露出一块豹纹(像是她的围巾或内衬袖子)。
    • 中间是一位男性,最靠前,橙色羽绒服(帽兜放下),露出格子衬衫下摆,浅蓝牛仔裤,深色 New Balance 运动鞋;头发灰白,戴眼镜(右侧能看到镜腿和镜框边)。
    • 右边是一个孩子,比大人矮一个头,藏青色连帽羽绒服(背上有一道反光条),黑裤子,头上戴白色耳罩(头箍和右耳罩都看得见),棕色头发。
    • 最平常的解读:一家三口——父母和孩子,一起出来参观。
  • 视线和动作:三人都仰头朝前上方看墙面。男人的脸略朝右前方,女人把头靠在他身上,孩子跟着一起抬头。手都看不见(插兜或垂着),没有指点之类的动作,就是安静地站着读。
  • 场景:一排哥特式尖券连拱(石砌券面、成束的细柱、扇形肋拱顶),券内墙面刻满一行行人名,第二个券顶有校徽浮雕,券内有十字。墙前挂一道低矮的铁链作隔离。这是一处纪念墙(从建筑和刻字看很像多伦多大学 Soldiers' Tower 的纪念拱廊,但我没有把握,也不需要在海报里点明)。
  • 能认出身份的细节:橙色羽绒服的横向绗缝、眼镜、白色耳罩、运动鞋的白色鞋底、低垂的铁链、尖券和柱头。
  • 色调:照片做了降饱和、偏冷的处理,石头是中性偏冷的浅灰;整幅画里唯一鲜明的颜色就是男人的橙色外套,其次是女人的浅黄色外套。

2. 故事

一家人靠在一起,安静地读一面写满名字的墙——记得这件事,就是这样一起站着,把它传给孩子。

3. 取舍

保留

  • 核心母题(唯一):三个人靠在一起的背影剪影。女人的头靠向男人、孩子半躲在男人身侧,这层亲密关系是整张照片的情感核心,所以三个人保留为一个整体,不拆开。
  • 辅助形 1:一个尖券(券面 + 两根柱 + 柱头)。它是"地方"本身,也是整套几何框架的来源。叙事意义:时间的容器,人在它面前很小。
  • 辅助形 2:名字墙 → 动势场。墙上的刻字不画成字,转成一片由视线落点向外扩散的网点和断线(见第 6 节)。叙事意义:被读着的那些名字、被唤起的回声。
  • 辅助形 3:低垂的铁链(手绘线)。叙事意义:一条看得见的界线——"停在这里,看";它也是照片里最好认的现场细节。

删掉

  • 第二、第三个拱券、砖墙、扇形肋拱的雕饰、校徽浮雕、玫瑰浮雕:重复、装饰性强,会分散焦点。
  • 十字、校徽、刻字原文:十字和墓志式文字会把画面直接推向"死亡/墓地"的联想(见第 8 节),而且会成为第二个视觉中心。
  • 地砖、台阶、地面阴影:多余的背景。
  • 豹纹围巾、格子衬衫的格纹、NB 标志:细节太碎,留下就成了写实插画。格子衬衫只保留为夹克和裤子之间一道露白的纸缝。

4. 几何框架

全部尺寸单位为像素,坐标原点在左上角。所有关系都写成 src/poster.py 开头的常量,图形、文字和动势场都从这些常量算出位置。辅助线、圆心、网格、标记点一律不画。

量取值来源 / 关系
尖券内跨 w1080照片里拱券内跨与人群高度的比例,约 2 : 1
拱的竖轴 x = XA1100偏左,约为宽度的 0.37,把右侧大片留白让给文字
地面线 YG1740男人的鞋底
人物高552= 短边的 27.6%;按 0.8 倍缩放照片里实测的人群高度 690
起拱线 YS1188= YG − 人物高,男人的头顶恰好落在起拱线与竖轴的交点
尖券两段弧半径 = w等边尖券:右弧圆心在左起拱点 (560, 1188),左弧圆心在右起拱点 (1640, 1188);券顶 y = 253
券面 / 柱宽 c108 = w / 10外弧与内弧同心,半径 w + c;外弧在起拱线处正好落到柱子外缘,柱子与券面是同一条带子
柱头高 22,两侧各挑出 0.16c落在起拱线上
内切圆半径 ρ = 3w/8 = 405,圆心 G = (1100, 783)与两段券弧内切、与起拱线相切的圆,也就是券头的"眼"。它的最低点就是男人头顶

各元素对齐的关系:

  • 人群:男人头顶对齐竖轴与起拱线的交点(也就是内切圆的最低切点),脚落在地面线上。
  • 动势场:中心 = 内切圆圆心 G(视线落点);外缘由券内轮廓(内缩 34 px)裁切,并在半径 1.3ρ 处衰减到零(见第 6 节)。
  • 铁链:两端挂在两根柱子的内缘上,挂点在起拱线下方 300 px(照片里铁链与男人胯部同高),自然下垂 56 px,从人群身后穿过。
  • 中文竖排标题:中轴在 x = XA + w = 2180(从拱轴向右平移一个整跨,与"半跨 → 柱 → 一跨"形成比例递进);首字顶端对齐内切圆的最高点 (y = 378),末字底端对齐起拱线 (y = 1188)。也就是说,标题的长度正好等于内切圆的直径,与它并肩。
  • 英文标题:旋转 90°,紧贴中文标题右侧,与中文等长(378 → 1188),靠字距撑满。
  • 两条注释:左缘对齐中文标题列的左缘 (x ≈ 2151),最后一行落在地面线上,与柱脚、鞋底在同一条水平线。

5. 配色

全图一共三种墨加纸色,每种墨是一个版。

角色色值来自照片选择理由
纸#F4F1E9照片整体偏冷、中性的天光和浅灰石面选"冷米白":明亮,不发黄,和石墙的冷灰同一个色温
深色骨架#1F2B38 藏青孩子的羽绒服(实测 #182227)、女人的深色牛仔裤(#182B3A)比纯黑温和,带一点石头的冷蓝。头发、裤子、鞋、动势场、手绘线和文字都用它。同色淡版:拱券 20%,男人的浅色牛仔裤 40%
主题色 1#DE6834 橙男人的橙色羽绒服(实测降饱和后约 #B45645)全图唯一真正鲜明的颜色,也是视觉中心的落点。照片的调色压低了饱和度,所以按"清爽、鲜活"的要求提亮了;同时把色相从偏红的约 9°往黄推到约 18°,让它确定地读作橙色外套,不会靠近血色
主题色 2#E8DD80 浅柠檬黄女人的浅黄色菱格外套(实测 #DBD8C3)和橙色是邻近的暖色,与藏青、冷米白放在一起很克制。只用在一件外套上

叠印方式为正片叠底:out = paper × Π(1 − coverage × (1 − ink))。人物之间按前后关系做了"挖空 + 1 px 陷印"。套印错位:橙版 (+2, −1) px,黄版 (−2, +2) px,藏青版不动。

6. 动势场

  • 转化的是哪种关系:三个人仰头读墙,是一种视线关系。照片里视线的落点是墙上一行行刻着的名字。
  • 运动逻辑(唯一):从一点辐射。以视线落点 G(券头内切圆的圆心)为中心,墙上的"名字行"在 G 附近最密、最黑。越往外,每一段越长、段与段之间的空隙越大、网点越小,最后完全消失。没有同时用坠落、流动或涟漪。
  • 组成:沿刻字行距(14 px)排列的粗糙网点串(每个网点是带随机抖动的六边形),夹杂断续的发丝线(像刻出来的一行字),再加上越往外越稀的散粒。
  • 衰减:密度 = (1 − u)^1.6,u 是到 G 的归一化距离(纵向压扁 1.15 倍)。u = 1 对应 1.3ρ,外缘再用一层低频噪声打乱,避免出现一圈规整的边界。
  • 边界:由几何框架决定——横向被尖券内轮廓(内缩 34 px)裁住,向下在起拱线附近已经衰减得很弱;靠近人物的地方再空出 15 px 的纸色,动势场不贴身体。
  • 为什么没用同心涟漪:试过两版。正圆环一出来就像靶心;压扁的椭圆环又像漩涡/黑洞。在纪念场所的语境里,两种都可能引起不适的联想,所以放弃,改用横行辐射(见第 8 节)。

7. 配文

位置中文英文
标题,竖排,x = 2180,与内切圆等高记得是一种站法REMEMBERING IS A WAY OF STANDING(旋转 90°,与中文并排、等长)
注释一,地面线上方一些声音,只在安静里才听得见some voices are heard only in quiet
注释二,落在地面线上传下去的,是停下来的那一刻what is handed down is the pause
  • 为什么放在那里:标题与内切圆(动势场的中心)等高并列,等于在旁边说出"那里正在发生什么"。注释落在地面线上,和人物的脚、柱脚处在同一个"大地"层面,是一句很低的旁白。整个文字区放在右侧大片留白里,从拱轴向右一个整跨,不压到图形。
  • 自查是否在描述画面:
    • "记得是一种站法":画面里看不到"记得","站法"是隐喻(陪伴、停下、靠在一起),不能直接当画面说明用。✓
    • "一些声音,只在安静里才听得见":画面里没有声音,说的是感受。✓
    • "传下去的,是停下来的那一刻":说的是父母带孩子来这件事的意义,不是画面内容。✓
    • 文字里没有出现时间、地点、标题栏、风格名、署名或水印。

8. 不良联想自查

成品出来后,我把整图缩小单独看了一遍,又逐块放大检查。设想读者第一眼可能产生的联想,以及对应的处理:

  1. 靶心 / 瞄准(第一版动势场是同心圆环,圆心正好在人头上方)→ 在战争纪念的语境里很危险。已整体改掉,不用任何同心环。
  2. 漩涡 / 黑洞 / 传送门(第二版用压扁的椭圆环,中心发黑)→ 带科幻和不安感,已改掉。
  3. 墓碑(灰色尖顶加里面一片"字")→ 拱券画成开放的券框(券面 + 柱 + 柱头),内部是纸色,不是一整块实心碑形。动势场也没有画成可读的字,而是网点和断线,读起来更像"一墙的光点/回声"。删掉了十字、校徽和墓志式文字。
  4. 雪花(人物剪影上的白色斑点)→ 第三到第五版的磨损斑、方形针孔、纸齿露白在深色衣服上像落雪。已调整:深色衣服只保留横向干笔纹,取消方形针孔,提高藏青人物部分的"压力"。现在剩下的是细小的不规则飞白,不再成片。
  5. 血迹:橙色只出现在男人的外套里,边缘锐利,没有任何橙色颗粒或拖尾离开身体;色相也从照片里偏红的锈橙推向了黄橙。动势场和手绘线都用藏青,不用暖色。✓
  6. 铁链像囚禁:铁链画成很细的手绘链环,低低地垂在人身后、挂在两根柱子之间,是博物馆式的隔离链,不缠绕人物。我自己看的时候没有读出束缚感,但这一项承认有一点主观。
  7. 秃头(男人的灰发是一块平涂的灰色时,头像光头)→ 改用低压力拓印,让纸齿把这一版打碎成花白的发丝感。

9. 逐条自检

第 2 节硬性限制
#限制依据
1只能用代码作画✓所有形状都由手写坐标、Catmull-Rom 样条、圆弧公式、悬链线公式生成;肌理全部来自种子随机数和值噪声
2不用图像生成模型 / 视觉模型✓只用了 numpy 和 Pillow,没有任何模型、API 或网络调用
3生成程序不读取照片✓src/poster.py 里没有打开 reference.jpg 的代码(grep 可查)。观察照片用的是放在会话临时目录里的辅助脚本(取色中位数、画坐标网格放大图),不属于交付物。观察结果以手写的坐标和色值写进程序
4不用外部图形素材✓唯一的外部资源是系统自带的 Noto Serif CJK SC 字体
5不用预装 skill / 插件 / 旧项目✓从空目录开始写,没有调用任何海报类 skill 或模板
6结果可复现✓SEED = 20261013,所有随机都来自同一个 numpy.random.default_rng;连续两次 ./run.sh 的 md5 都是 43a310cbfd34b8b371ba7199f6b62a2b
7一张平面海报✓只有原稿本身,纸色铺满四边,没有样机、边框或拼图
4.2 可核对规格
项依据
核心母题一个,辅助形 ≤ 3✓母题:一家三口;辅助形:尖券、名字墙 → 动势场、铁链,叙事意义见第 3 节
几何框架(圆/弧 + 轴线,不画辅助线)✓等边尖券的两段弧、券头内切圆、拱的竖轴、起拱线、地面线;所有位置都从这些量算出,图上看不到任何一条辅助线或标记点
主体尺度 ≤ 短边 35%✓人群高 548 px = 短边的 27.4%(程序输出)
留白 ≥ 50%✓没有墨迹的纯纸面积 = 90.9%(程序统计:三版覆盖率都 < 0.02 的像素)
色版✓每种墨一个覆盖率版,内部有墨色不匀、纸齿露白、磨损斑、干笔纹;形状边缘由 2 倍超采样多边形得到,保持锐利;正片叠底;套印错位 2–3 px
配色✓纸 + 藏青 + 橙 + 浅柠檬黄,共三种墨;藏青的 20% 和 40% 淡版不另算
动势场✓只有一个,逻辑是从视线落点辐射;由网点、断续发丝线和散粒组成,密度衰减到零
手绘线只用于识别细节✓铁链、眼镜、耳朵、耳罩、羽绒服绗缝、鞋底线;都由短笔触组成,粗细和浓淡随机,有抖动,偶尔断开,局部重描
纸张✓多倍频斑驳 + 9000 根纤维 + 杂质点 + 颗粒,不是纯色
文字✓中文标题 + 英文对应 + 两条中英注释;中文竖排、英文旋转 90°;画面上没有配文以外的任何文字
不良联想✓见第 8 节,问题项都已改掉或说明

10. 实现摘要

  • 语言 / 库:Python 3.12 + numpy 2.1.3 + Pillow 11.0.0(装在本目录的 .venv 里,系统 Python 不允许直接 pip 安装)。字体:/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc,第 2 号字面(Noto Serif CJK SC),中英文都用它。
  • 生成命令:./run.sh,单次约 25 秒。
  • 纸张 make_paper():底色乘以 4 倍频值噪声(±3% 明度)和一层极轻的冷暖偏移;用 Pillow 画 9000 根随机弯曲的短纤维,模糊后按 ±10% 调制明度;加稀疏的杂质点和 2×2 平均后的高斯颗粒。
  • 值噪声 value_noise():用种子随机网格做双三次放大,叠加多倍频,按 0.5% / 99.5% 分位数归一化。各向异性的格子(例如 2.2 × 160)用来生成干笔纹。
  • 形状:人物轮廓是在照片坐标下手量的点列(MAN_JACKET 等),经 T() 平移缩放,并用 Catmull-Rom 样条平滑,在 2 倍超采样下画成多边形,再用 BOX 缩回 1 倍,得到锐利但抗锯齿的边缘。拱券由 pointed_arch() 的圆弧公式生成。
  • 色版肌理 rubbing():覆盖率 = 密度 × 墨色不匀(低频噪声)× 纸齿命中(细噪声与慢变"压力"比较,压力轻的地方墨跳过纸面的低点)×(1 − 磨损斑)×(1 − 干笔纹)×(1 − 单像素针孔)。不同部位用不同参数:拱券压力轻、纹路重;人物压力重、以干笔纹为主;头发用低压力,做出花白感;文字几乎不加肌理。
  • 叠印:藏青、橙、黄三版分别平移(套印错位)后,按正片叠底乘到纸上。
  • 动势场 gaze_field():沿 14 px 行距逐行扫描,生成长度、间距随 u 增长的"词段";按密度概率决定是否落墨,以及落成发丝线还是网点串;再撒散粒。整体用券内轮廓和人物膨胀掩模裁切。
  • 手绘线 Hand:把路径按弧长切成 7–18 px 的短笔触,每笔有法向抖动,粗细 0.6–1.35 倍、浓淡 55–100% 随机,7% 概率断开,30% 概率局部重描,相邻笔触略有重叠,模拟落笔时的停顿。铁链由悬链线上交替出现的椭圆链环和侧面短杆组成,被人物挡住的部分不画。
  • 文字 text_layer():中文逐字竖排,字距按"内切圆直径"均分;英文先在横条上按计算出的字距逐字排好,再旋转 90° 贴入;注释逐字加字距。文字也进藏青版。

11. 已知不足

  • 人物仍偏"剪影插画":轮廓是手量点再样条平滑,肩、帽兜、裤腿的转折比照片圆,三个人的体块感有一点"贴纸"味,没有完全做到拓片那种生硬的刀口。
  • 动势场的"辐射"不够强:横行的网点和断线读起来更像"一墙的光点/字",向外扩散的方向感主要靠疏密体现,远看偏静态。这是为避开靶心和漩涡联想做的让步。
  • 拱券的磨损分布有偶然性:靠近券顶有一块露白比较集中的区域,是随机种子的结果,我觉得可以接受,但不是有意安排的。
  • 男人牛仔裤的 40% 藏青淡版偏灰,读成"浅蓝牛仔裤"要靠联想。
  • 英文用的是 Noto Serif CJK 里的拉丁字形,小字号下字形略宽,不如专门的拉丁衬线体精致(为了不引入下载步骤,没有另装字体)。
  • 我没有第二双眼睛做"冷读",第 8 节的联想自查只代表我自己的判断。
03

Sonnet 5.5

Sonnet 5.5 生成的海报《名字比我们高》
点击海报放大 · ← → 翻看
我的主观评价

蓝色双线拱大胆置换掉了常规的石灰基调,与暖橙外套冷暖互衬,配色极为清爽。但最左侧人物的连帽同样交代不清;大字标题的位置也略显喧宾夺主。

海报配文
「名字比我们高」The names stand taller
故事
一家人站在刻满名字的墙前,把头仰起来读——名字比活着的人更高,也更安静。
↓ 完整文件包 ZIP · 5.6 MB ↓ 海报原图 PNG · 3.9 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/poster.py
模型自述报告REPORT.md

生成命令:./run.sh(在本目录,一条命令,产出 poster.png,3000×2000,固定种子,重复运行 md5 相同)。

1. 读到的照片

  • 主体:三个人的背影——一个穿橘红色羽绒服、牛仔裤的成年人居中;左边一个穿浅黄色羽绒服、深色长裤的人(肩上有豹纹/斑点衣物);右边一个穿黑色外套、戴白色耳罩的孩子。三人紧挨站着,身体相互靠拢,大致是一家人,取最平常的解读。
  • 视线:三个人都背对镜头,头部微微上仰,看向面前高处的石墙。
  • 动作:站定不动,靠在一起,成年人的手臂环着身边的人。
  • 场景:哥特式尖拱回廊里的一面纪念墙,墙上密密刻着人名和军衔,上方刻有十字和题词,应是大学里的战争纪念廊。前面拉着一道链条护栏,人站在链条之内的石板地上。
  • 认出身份的细节:尖拱、石柱、满墙的名字、链条、橘色外套。

2. 故事

一家人站在刻满名字的墙前,把头仰起来读——名字比活着的人更高,也更安静。

3. 取舍

  • 保留:三个背影(核心母题);一道尖拱(人所在的"壳",也是几何框架);链条(人与墙之间那条不可越过的敬意)。辅助形共两个。
  • 删掉:墙面的全部文字与浮雕、拱顶的花饰、石砌外墙、相邻的拱、地砖、其他展灯与通风口。原照片里最抢眼的是石头的质感,但那是"哪里",不是"谁在做什么"。
  • 简化:人物只留剪影与三块色版,只在能认出他们的地方画细线(黄外套轮廓与绗缝、耳罩、兜帽边、豹纹袖、鞋底、链条)。

4. 几何框架

一个等边尖拱:跨度 S = 1000 px,两段圆弧的半径都等于 S,圆心分别落在对侧的起拱点上。

量数值来源
轴线 x₀1130橘色外套人物的中线(画面中最有重量的人)
起拱线 y_s1320拱顶尖高度 0.866·S = 866,使拱尖落在 y = 454
地面 y_g1760三人鞋底、两根拱柱底部同在这条线上
拱弧圆心(630, 1320)、(1630, 1320)互为对侧起拱点
内圈拱圆心相同,半径 938(外拱 − 62)嵌套
内切圆圆心 (1130, 945),半径 0.375·S = 375与两段拱弧及起拱线同时相切;不画出,只用来裁出动势场的外形

各元素的对齐关系:

  • 三个人:脚在 y_g,居中者的中线在轴线 x₀ 上,尺度 0.85,人物高度约 588 px(≈ 短边 29%)。
  • 拱柱:从起拱线垂直落到 y_g,与人脚同基线。
  • 中文标题竖排:高度从拱尖 y=454 到起拱线 y=1320,即拱头的高度(866 px);左边缘贴着右拱柱外缘留 36 px。
  • 英文标题旋转 90° 读起:同样占 454–1320 的垂直范围,与中文标题以轴线镜像,贴左拱柱外缘。
  • 注释:基线落在地面 y_g,左边缘与中文标题同一竖线。
  • 链条:两端挂在两根拱柱上,下垂度 78 px,画在人物身后。
  • 动势场:起点在三人头顶之上,外形被内切圆裁出,顶部在圆顶 y≈570 前散尽。
  • 未画任何辅助线、圆心、十字、网格或标记点。

5. 配色

角色色值来自照片理由
纸色(243,242,238) 冷米白墙面的冷灰白照片整体偏冷,选明亮、不发黄的冷米白
深色(27,34,42) 蓝黑孩子黑外套(实测约 24,34,39)承担头发、深色衣裤、鞋、链条、文字,和蓝色同属冷调
主题色 1(222,84,48) 橘红居中者的羽绒服(实测约 166–176,79–81,65,提亮提纯)全图唯一的暖色,只用在这一件外套上,是视觉中心
主题色 2(66,106,150) 牛仔蓝居中者的牛仔裤(实测约 72,102,129)用于牛仔裤与尖拱,把"人"与"壳"放在同一色版里

共 3 种墨色 + 纸色。浅黄外套没有单独成版,直接露出纸面。

6. 动势场

转化的是仰头的视线——三人一起往上看这一动作。运动逻辑只选一种:上升。由网点(直径随高度缩小、间隙加大)、每个点下方拖着的 1–3 个更小的点(表明它在向上走)、少量断续细线和远处散点构成;密度从头顶向上衰减,在内切圆顶部之前归零。外形和边界由内切圆(圆心 (1130, 945),r = 375)裁出,列宽由头点出发的高斯展开决定。不使用橘色,避免和人物外套混淆。

7. 配文

位置中文English
右拱柱外,竖排,高度 = 拱头名字比我们高(左拱柱外,旋转 90°)THE NAMES STAND TALLER
右下,基线在地面线上有人替我们站得更久。Someone stood longer for us.
右下,同上沉默是另一种朗读。Silence, read aloud.

放在这里是因为拱柱外缘和地面线本身就是框架的边,文字靠着它们排,参与同一套秩序。自查:没有一句能直接当作画面说明——"名字比我们高"是情绪与隐喻(画面里看不到任何名字的字形),两条注释说的是沉默与替代,而不是"一家人在看墙"。

8. 不良联想自查

整图单独看过,设想读者第一眼可能产生的联想:

  1. 血迹/伤口:橘红色是全图唯一暖色,且贴着人体。因此:橘色只存在于外套这一整块平涂版里,边缘锐利,形状就是羽绒服;动势场刻意只用深色和蓝色,不用橘色;颗粒不贴着身体(用人物剪影的膨胀轮廓抠出了 20px 的空隙)。第一版曾让颗粒带尾巴垂在橘色外套上,看起来像滴落,已改为"点 + 向下的小点列"并清出人物周围区域;外套里曾出现一块形似手印的浅色磨损斑,也已消除。
  2. 下雨/滴水:第一版颗粒像雨,因此改成圆点加下方后缀小点(表明在上升)、越往上越稀,且完全被限制在拱内。
  3. 灵堂/遗像:拱形加人群有这类联想,因此用了清爽的蓝黑橘配色、大量留白,没有黑白对比、花、烛、十字。
  4. 手持/绑缚:链条画在人物身后,且只是一圈轻线,不触及身体。

9. 逐条自检

第 2 节硬性限制:

  1. ✓ 只用代码作画:图形来自手写坐标、圆弧公式和程序噪声,无外部图片。
  2. ✓ 未使用任何图像生成或预训练视觉模型。
  3. ✓ src/poster.py 全文没有打开 reference.jpg(可检索确认);我观察照片时只用 Pillow/numpy 裁图、取均值色,所得只以手写数字进入程序。
  4. ✓ 无外部素材;仅使用本机已装 Noto Serif CJK。
  5. ✓ 未调用任何 skill、模板或旧项目代码,一切从空目录开始。
  6. ✓ 种子固定(SEED = 20261014),连续运行两次 md5 完全一致。
  7. ✓ 单张平面海报,纸色铺满,无边框、样机或拼贴。

第 4.2 节:

项结果依据
核心母题✓一个:三人背影;辅助形两个(尖拱、链条),叙事意义见第 3 节
几何框架✓圆弧 + 轴线 x₀,见第 4 节;未画辅助线
主体尺度✓人物高度约 588 px = 短边 29.4% < 35%
留白✓24px 方块内完全无墨的面积约 86%;墨迹像素占 4.3%
色版✓深色、橘、蓝各一版;有断墨、纸色露白、水平干笔拖痕;边缘用解析式/超采样抗锯齿,清晰;叠印用正片叠底;橘版偏移 (+3,−2) px,蓝版 (−2,+2) px,与深色版相对错位约 3–4 px
配色✓纸 + 深 + 橘 + 蓝,无其他墨色,无渐变(仅纸张自身的微弱明暗)
动势场✓一个,上升;由圆点、尾点、细线、散点组成,密度衰减到零
手绘线✓只用于黄外套轮廓与绗缝、耳罩、兜帽边、豹纹、鞋底、格子下摆、链条;短笔触,粗细起伏,抖动,有断口
纸张✓程序生成的低频斑驳、颗粒、纤维、深色斑点
文字✓中文标题一句 + 英文对应 + 两条中英注释;中文竖排,英文旋转 90°;画面上只有配文
不良联想✓见第 8 节

10. 实现摘要

  • 环境:Python 3 + numpy + Pillow(系统没有 numpy,run.sh 在本目录建 .venv 并 pip install numpy pillow;已有 .venv 则直接用)。字体:Noto Serif CJK SC(Bold 用于标题,Regular 用于英文与注释),本机已装。
  • 纸:基色 + 多倍频值噪声的低频斑驳 + 逐像素颗粒 + 5200 条随机短纤维(深浅两种)+ 稀疏深色斑点。
  • 色版:形状 = 手写坐标经 Catmull-Rom 平滑后以 3× 超采样填充;拱用到圆心距离的解析式覆盖率。磨损函数(wear)用归一化的多尺度噪声做断墨斑和针孔,用横向拉伸的噪声做干笔拖痕,另有低频浓淡与逐像素颗粒;边缘不受磨损影响。叠印为 paper × (1 − a + a·ink/255),按蓝、橘、深的顺序。
  • 动势场:横向偏移的格点(行与行交错)上按"高度 + 横向高斯"概率撒点,点半径随密度变,下方可带 1–3 个更小的点;另有若干断续细线和散点;统一用内切圆裁外形,并用人物剪影的膨胀轮廓清出空隙。
  • 手绘线:沿折线以 2 px 步长采样,叠加正弦与随机游走的法向偏移,笔压按弧长起伏,按随机长度和间隔断开;链条的椭圆链环与竖直链环交替。
  • 文字:Pillow 逐字绘制,中文竖排按固定节距,英文按字距铺满 866 px 再旋转 90°;文字也过一遍轻微的磨损。
  • 命令:./run.sh(等价于 .venv/bin/python src/poster.py)。

11. 已知不足

  • 人物只是剪影化的色块,头部偏圆,缺少颈部与耳朵的转折,近看略显"卡通",离"拓片"的刻线感还差一些。
  • 干笔拖痕全是水平方向,规律性偏强,有点像扫描线。
  • 动势场的列宽偏窄且整体偏方正,更像一团颗粒而不是向上"升"的流动;顶部的散点可以再破碎一些。
  • 拱的两条线粗细和磨损相似,嵌套关系不够明显;拱柱底部没有任何落地的交代。
  • 右侧三分之一完全空着,构图重心偏左;是有意的留白,但可能显得略失衡。
  • 链条的透视和人物间的遮挡是简化的,没有交代它穿过孩子腿后。
04

Sol 6.1

Sol 6.1 生成的海报《把片刻留长》
点击海报放大 · ← → 翻看
我的主观评价

画面的人物姿态传神,细节也到位。拱门右侧只留一半是个大胆的审美决定。铁链两端悬空未接立柱,动势场的表现太弱。

海报配文
「把片刻留长」Let the moment linger
故事
有人陪着,不急着开口,一个停留的片刻就可以长一点。
↓ 完整文件包 ZIP · 3.8 MB ↓ 海报原图 PNG · 2.2 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · requirements.txt · run.sh · src/draw_poster.py · src/verify.py
模型自述报告REPORT.md

1. 读到的照片

原图是横向照片,实际像素为 3000 × 2000。画面下方偏左有三位背对镜头的参观者,站在一面刻有大量姓名、文字的石墙前。建筑有连续的哥特式尖拱、石柱和雕刻,墙前设有链条隔挡。从铭文、徽饰和空间形制判断,这是带有纪念性质的历史建筑空间;无法仅凭照片确定具体地点。

放大人物后,可以看见:

  • 中间的人较高,穿橙色连帽羽绒外套、浅蓝牛仔裤和深色运动鞋,短发,侧面露出眼镜。他的脸转向右上方,身体主要仍背对镜头,两脚的方向不完全相同。
  • 左侧的人穿浅黄色连帽外套、深色长裤,带有黑白花斑的浅色肩包。头靠近中间人物,向右侧略倾。
  • 右侧的人较矮,穿深色羽绒外套和深色长裤,头发略长;头顶能看见浅色的弧状细节,可能是架起的眼镜。脸朝墙面略偏右上方。
  • 三人的视线大致落在墙上较高处的刻字区域。手部没有清楚露出,可能收在衣侧或口袋附近;没有看到明确的指点动作。

最普通的解释是:三位结伴的参观者,停下来一起看墙上的文字。照片不足以确认他们是家人、朋友还是其他关系,也不能证明某个人正在讲解,因此海报没有补写这些情节。

2. 故事

有人陪着,不急着开口,一个停留的片刻就可以长一点。

3. 取舍

核心母题只有一个:靠近站立、共同看向前上方的三人背影。三人作为一个完整的关系形态处理,不拆成三个相互争夺注意力的中心。

保留橙色羽绒服、浅黄外套、深色外套、中央人物的眼镜和牛仔裤姿态,以及左侧浅色花斑包。这组颜色与高矮关系,是辨认原照片最直接的依据。衣服用完整色块表现,少量纸色间隙说明羽绒分格,不复刻反光、每一道褶皱和所有缝线。

独立辅助形只有两项:

  1. 一段浅色尖拱残片:保留建筑的空间尺度,说明他们正面对一个比自身大得多的对象。它是照片中建筑实体的概括,不是展示几何关系的辅助线。
  2. 一条被人物遮挡的链条:保留参观空间中“可以靠近,但不过界”的距离关系。没有画链柱、告示牌或第二组链条。

删掉其余拱门、石块拼缝、地砖、灯具、完整石柱、徽章、十字和全部墙面铭文。既避免完整复制背景,也避免纪念符号把日常参观的瞬间引向哀悼或死亡叙事。没有增加传统纹样、印章、太阳、植物等装饰。

4. 几何框架

下列坐标以左上角为原点,单位为输出像素。所有圆心、轴线和构图基准只用于计算,成品不显示它们。

4.1 从主体推出的尺度和轴线

以中央人物背部的近似竖直结构作为人物轴,令 x = 1400;站立基准为 y = 1560。选取模数 u = 70,人物名义高度为 9u = 630,局部头发和鞋底超出名义框少许。手写轮廓的实际高度为 637 像素,含抗锯齿的印版包围盒高度为 642 像素,占短边的 32.10%。

三人的坐标写在一个局部坐标系里,其原点为 (人物轴 − 180, 站立基准 − 9u),即 (1220, 930)。人物的高矮、头部偏转、袖部和腿间留白均在这个共同坐标系内构造,不使用从照片提取的路径。

4.2 尖拱的两个圆

尖拱跨度为 14u = 980,两侧起拱点是 (980, 1220)、(1960, 1220)。两个圆心分别位于这两个起拱点,半径均为 980;左半拱由右圆心的圆弧产生,右半拱由左圆心的圆弧产生。

两圆上方交点为:

A = (1470, 1220 − 980 × √3 / 2) ≈ (1470, 371.295)。

拱的对称轴为 x = 1470,比人物轴向右偏 u。人物因此不机械居中,右上方仍留有视线可以延伸的空间。可见拱片厚度为 20 像素;右弧提前结束,左侧直段在 y = 1560 − 2u = 1420 停止,不组成封闭外框。

4.3 其余元素的对齐
  • 链条以拱轴 x = 1470 为对称基准,范围取两侧起拱点各内收 2.3u。用二次曲线近似一条中部下垂的悬链,再沿曲线排列细小椭圆链环;三人会遮住它。
  • 动势场起点为 (人物轴 + 2u, 人物顶部 − 52) = (1540, 878),单位方向为 (0.42, −0.907524…),延伸长度 5u = 350。其边界受同一尖拱的内侧圆弧限制。
  • 中文标题左沿为 右起拱点 + u = 2030,顶端为 起拱高度 − 7u = 730,逐字下移 0.78u = 54.6。英文与中文左沿共轴,放在标题起点下方 4.5u。
  • 微型注释左沿与左起拱点 x = 980 对齐,两行分别落在站立基准下方 1.08u、1.46u。

5. 配色

只使用一种纸色和三种墨色。下表是代码中定义的基色,叠印、淡版、抗锯齿和纸纹会产生更多实际 RGB 像素值,但不增加墨版种类。

用途色值来源与理由
明亮冷米白纸色#F7F7F0从浅灰石墙的冷亮感转成纸色,不采用偏黄的旧纸色。
深石板蓝墨#283D42概括右侧深色外套、头发、鞋和建筑阴影。承担主体骨架、链条、文字及动势;尖拱和牛仔裤都只用它的淡版。
橙色墨#D7703E来自中央人物最醒目的橙色羽绒服,略向明亮的陶橙调整。只留在衣服内,不把橙色散到身体周围。
浅柠檬黄墨#DCDE8B来自左侧浅黄色外套。保留照片中轻而鲜活的一端,与深色衣服形成辨识关系。

没有加入蓝色牛仔裤专用墨;其明度由深石板蓝约半浓度的淡版取得。尖拱使用约 17%—24% 的同色淡版。颜色选择来自目视判断,未用程序采样照片像素。

6. 动势场

转化的是三人向前上方看去的视线方向,不是风、雨、烟或人物的身体运动。唯一的运动逻辑是向右上方延伸。

场内有三种同向、同边界的成分:轻微扰动的网点、极小的随机散点、少量断续细线。密度按沿轴距离 t 的 (1 − t / 350)^1.9 或平方函数衰减,横向也向两侧变疏;到远端降为零。没有另加放射、涟漪、下坠或环绕效果。

整个场使用浅石板蓝,最高浓度也远低于人物深版。场的近端在头部右上方,与身体之间留有纸面间隙;不从头顶、后背或手部拖出任何色带。外缘再由尖拱内侧的圆弧裁定,避免变成任意漂浮的装饰云团。

7. 配文

标题

把片刻留长 LET THE MOMENT LINGER

中文位于尖拱右侧,逐字竖排;英文缩小后与它共用左沿。它借用拱外的余地,不压在人物上,也不成为第二个视觉中心。

一条双语微型注释

不急着说什么 NO NEED FOR WORDS

放在人物下方偏左,与建筑左侧基准共轴。这是一条注释的中英文两行,不是另外添加两组信息。

自查:两组文字都不交代人数、衣服、建筑或正在看什么,不能直接充当画面说明。它们只说停留的心情和不必交谈的相处状态。成品没有日期、地点、标题栏、风格标签、署名或水印。

8. 不良联想自查与实际调整

构思时首先排除了橙红色动势颗粒:这类颗粒如果贴着衣服,容易被误看成血迹、碎屑或身体流出的东西。因此橙色只用于闭合的外套色版,动势全部换成浅冷色,并与人物分开。

第一版整图中,完整的两侧拱脚容易把三人围进一个封闭的尖顶轮廓。考虑到原照片具有纪念空间的背景,这可能加强碑形或哀悼的联想。最终版提前截断右半拱,缩短左侧直段,不加地面封口;同时删去原照片中的十字、姓名和徽章。

局部检查还发现,中央外套和旁边深色衣服的大面积重叠会形成不明的暗色块。已经改成前后遮挡,只留下两像素套印错位应有的细小叠印;链条也移到正确的衣服后方,不穿过身体。

最后单独看整图,再查看人物、动势、标题和微注释的放大图:第一眼读到的是三个穿外套的人靠近站着、慢慢看向前方。浅色拱片像历史建筑的一段,点线像视线的轻微延伸。没有可见的伤口、喷溅、肢体破损、武器或不雅形态。对“绝无任何人的其他联想”无法作客观保证;上述是本次实际视觉检查的判断。

9. 逐条自检

9.1 第 2 节的七条硬限制
条目结果依据
1. 只能用代码作画✓人物、包、拱、链环均为手写坐标、贝塞尔曲线或数学曲线;所有纸纹和墨损均由固定种子的随机数生成。
2. 不用图像生成或预训练视觉模型✓没有调用图像模型、分割、描边、风格迁移 API 或网络服务;绘制只用 Pillow 和 NumPy。
3. 生成程序不能读取照片✓draw_poster.py 不打开任何输入图片。另在完全没有 reference.jpg 的临时目录连续生成两次,结果均与交付文件逐字节相同。观察阶段曾另用临时脚本裁切原照片查看人物,该脚本不是生成程序,也不被生成流程调用。
4. 不用外部图形素材✓无图片笔刷、纹理、图标、SVG 库或模板;只使用本机已经安装的 Noto 字体。
5. 不用预装 skill、插件或旧项目代码✓从本目录新写全部源码;没有调用海报 skill、插件、模板或以前的项目代码。
6. 可复现✓基础种子 20261029,各工序用确定的派生种子;两次隔离运行的 PNG SHA-256 与交付版本一致。
7. 一张平面海报✓只有一张 RGB 海报原稿,纸色到四边,没有样机、外边框、透视、墙面、外部阴影或照片拼贴。
9.2 第 4.2 节的全部规格
项结果依据
核心母题✓共同观看的三人是一个关系母题;辅助形只有尖拱片段与链条两项,叙事意义见第 3 节。
几何框架✓两个半径 980 的圆生成尖拱,人物竖轴和拱轴相差一个模数;图形、文字、动势均从该矩阵定位,圆心、轴线、网格和标点不画。
主体尺度✓三人联合印版含抗锯齿的高度为 642 像素,即短边的 32.10%,低于 35%。
留白✓各可见印版支持域合并后的保守统计,纯纸面占 96.19335%;连最浅的墨迹和抗锯齿像素都算作非留白。纸张本身的纹理不算墨迹。
色版✓内部有针孔、磨损斑、干擦线和不均匀墨量;纹理在轮廓内侧处理,边缘保持清楚;合成采用乘法叠印,橙版向右错位 2 像素。
配色✓一种纸色、深石板蓝一种、照片主题色橙与浅黄两种;总计三种墨,淡版不另增颜色。
动势场✓恰好一个向右上方延伸的场,由网点、散点和断续细线共同组成,沿距离衰减到零。
手绘线✓只在眼镜、头顶浅色细节、包带和鞋部针脚上使用短而断续的抖动墨线;衣服的大部分分格是色版内部的纸色间隙,没有给全身统一描边。
纸张✓全幅有程序生成的弱斑驳、细粒和约 22000 根细小纤维,不是纯色底,也没有外部纹理贴图。
文字✓一句中文标题及英文对应、一条双语微注释;中文标题竖排,图中只有配文本身。
不良联想✓最终整图和局部已目视复查;使用冷色场、身体外留隙、开放拱形,删去直接的纪念符号,未看到题目列出的不适形态。此项为主观视觉自查。

10. 实现与复现

文件
  • poster.png:最终海报,3000 × 2000,RGB,不带透明通道。
  • src/draw_poster.py:完整生成程序,所有绘图数据均写在代码内。
  • src/verify.py:独立复现检查。只复制生成源码到不含照片的临时目录,运行两次并比较文件哈希。
  • run.sh:一条命令生成海报。
  • requirements.txt:本次实际使用的两个 Python 库版本。
绘制方法
  1. 纸张:NumPy 细噪声、低分辨率随机场的双三次插值、程序绘制的短纤维相加。各通道共享大部分明度扰动,避免彩色脏点。这里的随机低频变化是微弱纸质斑驳,不是用于造型的常规色彩渐变。
  2. 形状:自写的路径解释器采样三次贝塞尔曲线,Pillow 在两倍分辨率下绘制色版蒙版,再以 Lanczos 缩小。
  3. 墨版肌理:对每版独立生成细小缺墨点、椭圆磨损和横向短擦痕,叠加墨量起伏。用五像素最小值滤波构造内侧区域,让轮廓附近仍保持锐利;这是对自绘蒙版的形态学处理,不是对照片做视觉处理。
  4. 叠印:以 纸面 × [1 − 覆盖率 × (1 − 墨色 / 纸色)] 合成,每版都使用同一种乘法透明墨模型。前景人物先从后方人物的版中挖空,避免把遮挡误做成大块透明重叠;橙版最终平移两像素。
  5. 动势场:在同一个斜向局部坐标系中生成网格点、散点和短线,按距离衰减,再按尖拱内侧圆弧限定范围。
  6. 手绘细节:将少量已指定的细节路径拆成短段,给端点、宽度、墨量加入微小扰动,并随机略去部分段落。没有采用现成手绘渲染库。
  7. 文字:中文标题用 Noto Serif CJK SC Regular;英文及微型注释用 Noto Sans CJK Regular。逐字定位,手动控制字距;字体之外没有外部资源。
环境
  • Python 3.12.3
  • Pillow 13.0.0
  • NumPy 2.5.4
  • 字体:/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc、/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc

依赖和字体在本机已经存在,没有安装依赖,没有修改系统配置。开始时一次可选的上级目录只读检索被沙箱拒绝,未重试、未扩大权限;当前目录的输入、输出和必需资源均可正常使用,因此未构成无法继续的阻断。所有临时放大图和隔离校验目录均位于 /tmp/opencode,不作为交付版本。

在本目录运行:

./run.sh

校验尺寸、RGB 模式、主体比例、留白和无照片环境下的逐字节复现:

python3 src/verify.py

生成命令不依赖工作目录,也不需要网络;其位置由源码路径确定。字体缺失时会明确退出,不会尝试更改系统或自行替换字体。

最终 PNG 的 SHA-256:

49dc598d678b1bc7afedff657b48325bcee7653b8ad7df175b3fb336c11429bc

实际检查结果:无参考照片的两次独立生成均匹配以上哈希;最终图已在整幅视图及人物、标题、微注释、动势四处放大视图中检查。交付目录只保留最后一版海报,不附早期版本或局部图。

11. 已知不足

  • 人物经过较强的平面概括,头发、脸部转角和手部无法像照片那样细读。辨识主要依赖三人的高矮、衣服颜色、站姿、眼镜和肩包,不是肖像级还原。
  • 墨损仍能看出数字随机过程的均匀倾向;虽然加入了长短不同的擦痕和斑点,与真实木刻、纸张吸墨形成的方向性破损仍有差别。
  • 尖拱非常轻、断得较开,降低了封闭碑形的风险,也损失了原建筑石质的厚重感。这是本次主动取舍。
  • 留白明显超过最低要求,动势也很淡;缩成小预览时,纤维、断线和英文微注释会弱化,需要原尺寸观看或印刷才能完整读到。
  • 复现承诺针对相同机器和相同依赖、字体;换 Pillow、NumPy 或字体文件,光栅化或随机数实现可能发生变化,不保证跨版本的 PNG 字节一致。
05

Fable 5.1

Fable 5.1 生成的海报《那些名字比我们年轻》
点击海报放大 · ← → 翻看
我的主观评价

人物尺度收得很小,人与墙的体量对比最贴近原照。问题是拱内填得太满,名字场板结成了一整块实心灰面,牺牲了呼吸感;人物下半身的比例姿态略显别扭;右侧文字与主体图形之间也缺乏必要的几何咬合。

海报配文
「那些名字比我们年轻」The names are younger than we are
故事
一个寻常的下午,三个人站在一堵名字墙前,发现那些名字比自己年轻。
↓ 完整文件包 ZIP · 8.1 MB ↓ 海报原图 PNG · 6.4 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/poster.py
模型自述报告REPORT.md

交付物:poster.png(3000 × 2000,RGB,无透明通道)、src/poster.py、run.sh、本文件。生成命令:./run.sh(等价于 python3 src/poster.py)。固定种子 20261015,两次运行 md5 相同(e932a99b…)。


1. 读到的照片

事实。 横向照片,3000 × 2000。一面哥特式的石砌纪念拱廊:三个尖拱并排,拱内的墙面从上到下刻满了小字(名字、军衔、部队番号),最左边拱顶下刻着 "TO THE GLORIOUS MEMORY OF MEMBERS OF THIS UNIVERSITY WHO FELL IN THE GREAT WAR 1914–1918",上方有一个小十字;中间拱下有一个校徽和一朵玫瑰浮雕。地面是深浅拼接的方砖。每个拱下、离墙约一米处有一条从柱到柱垂挂的黑色铁链,是拦人的护栏。

三个人站在最左边的拱下、铁链外侧(离镜头更近的一侧),全部背对镜头,抬头看墙上的字:

  • 左边:浅黄绿色羽绒服,深色裤子,深色运动鞋,深棕灰色短发,脖子上有一条黑白斑点围巾。
  • 中间:橙红色带帽羽绒服,下摆露出一截格子衬衫,浅蓝牛仔裤,深色运动鞋,灰白头发,戴眼镜。头略向右上方仰,是三人中看得最高的一个。他的左臂绕在左边那个人的背后。
  • 右边:藏青色外套,黑色裤子,黑色运动鞋,齐肩的棕色头发,头上一条白色发箍。个子最矮,到中间人的肩。

解读(取最平常的一种)。 一家三口——两位成年人和一个孩子——在一座大学的一战阵亡者纪念墙前驻足读名字。没有人在拍照或说话,姿态是安静的"看"。中间人的手臂搂着同伴,是日常的亲近。能让人认出原物的细节:尖拱和石柱、墙上成行成列的小字、垂挂的铁链、三件羽绒服的颜色、孩子的白发箍。

2. 故事

一个寻常的下午,三个人站在一堵名字墙前,发现那些名字比自己年轻。

3. 取舍

保留。

  • 核心母题:三个背影(一个色版组),尺度很小,站在拱下。
  • 辅助形一:一个尖拱的石质线脚(两道同心的浅灰带 + 两根柱身)。它交代"在哪里",也是整张图的几何矩阵来源。
  • 辅助形二:墙上的名字,转化为动势场(见第 6 节),不是逐字复刻。
  • 辅助形三:铁链。它是"看得见、走不进"的那条线,也是照片里唯一一条曲线。

删掉。 另外两个拱、拱顶的扇形肋、校徽、玫瑰、十字、碑文文字、地砖、射灯、警示牌、围巾、牛仔裤的蓝色、人脸和肤色。原因:风格要求一个视觉中心和看不见的秩序;十字和碑文会把画面推向宗教和死亡的直接表述;拼接地砖和扇形肋是装饰堆砌;多拱会稀释"一个洞口、一家人"的对比。

4. 几何框架

全部由一个模数推出:h = 330 px = 中间成人的身高(短边的 16.5%)。

量定义数值
跨度 S2h660
半径 R= S660
轴线 A竖直线 x = 1000(= 画幅宽的 1/3),穿过拱顶尖和中间人物x = 1000
地平线 YF人物脚底、柱础、竖排标题的末端y = 1620
起拱线 YSYF − S;柱高恰等于半径y = 960
两个圆心两侧起拱点 CL = (670, 960),CR = (1330, 960)—
拱顶尖YS − S·√3/2y ≈ 388
线脚宽度内道 S/16 = 41,纸缝 S/64 = 10,外道 0.35·S/16 = 14—
视线落点 G轴线 × 起拱线(1000, 960)

关系:

  • 尖拱是等边双心拱:左弧以 CR 为圆心、右弧以 CL 为圆心,半径都是 S。因为 R = S = 柱高,两个圆都与地平线相切,并各自穿过对侧的起拱点。
  • 人物组:中间人物的头顶在轴线上,脚底在地平线上;人物坐标全部用同一个比例 k = h/690 从照片量得的数字映射进来。
  • 动势场:以 G 为圆心、半径 R 的圆决定衰减到零的边界(恰好下切地平线),拱的内边缘决定裁切;衰减中心 G 在中间人物头顶正上方 h 处,即"抬头看"的落点。
  • 铁链:两端挂在两根柱身内缘,高度 YF − 0.58h,悬链线垂度 0.11h;它只出现在人物以外(人物在链前面,挡住它)。
  • 竖排中文标题:x = A + 1.5S = 1990,即以 CR 为圆心的大圆的最右切点;从起拱线挂下、止于地平线,长度正好等于柱高 S。
  • 英文标题旋转 90°,站在地平线上向上读,跨度同样是 S,形成第二根"文字柱"。
  • 两条注释:x = A + 2S = 2320;一条顶对齐起拱线,一条基线落在地平线上。

成品里没有画任何辅助线、圆心、网格或标记点。

5. 配色

角色色值来自照片为什么
纸色#F2F1EC 冷象牙白阴天漫射光下的浅色石墙照片色温偏冷,取偏冷的米白但保持明亮
深色#232B33 蓝黑孩子的藏青外套、三人的深色裤子一种深色统管剪影、头发、鞋、链、名字、文字
主题色 1#D8552E 橙红中间人物的羽绒服整张照片最鲜活、最有辨识度的一块颜色
主题色 2#E1D45E 浅黄左边人物的羽绒服第二个让人一眼认出的颜色,和橙红相邻
淡版深色 22% → 石质线脚;深色 50% → 牛仔裤石柱、浅蓝牛仔裤同一深色的淡版,不另算颜色

全图墨色三种(深、橙、黄)+ 纸一种。各版正片叠底,套印错位:深 (0, 0)、橙 (+3, +2)、黄 (−2, +3) 像素。

6. 动势场

转化的是什么。 照片里真正的"运动"只有一种:三个人的视线从头顶向上、向墙面铺开,落在密密麻麻的名字上。

选择的运动逻辑。 从一点辐射。以 G(视线落点)为中心,名字行的密度按 (1 − d/R)^1.5 衰减,d = R 处为零。元素是水平的短划(成行的"名字":短、中、长三种长度,词间留隙),行距 10 px,行基线有轻微起伏;外围短划碎成更短的片段和点,再加一层同样衰减的细小网点。整个场再乘以一张干笔肌理,所以有断墨和露白。

边界。 裁切边界是拱的内缘(两段圆弧 + 两根柱身内侧),衰减边界是以 G 为圆心、半径 R 的圆(下切地平线,上端在拱顶尖以上、被拱裁掉)。人物周围留 6 px 纸边。只有这一个场,没有第二种效果。

7. 配文

文字位置为什么
那些名字比我们年轻竖排,x = 1990,起拱线到地平线它是整张图的"第三根柱子",与拱的两根石柱同高,让排版进入几何秩序
THE NAMES ARE YOUNGER THAN WE ARE旋转 90°,紧贴中文右侧,站在地平线上向上读与中文同跨度,字距按跨度 S 反算,形成一对文字柱
有些下午,只用来站一会儿 / Some afternoons are only for standing a while.注释一,x = 2320,英文基线落在地平线和人物的脚、柱础、标题末端站在同一条线上
石头留住的,风只读一遍 / What the stone keeps, the wind reads only once.注释二,x = 2320,顶对齐起拱线和拱的起拱点、铁链柱头处于同一水平带

自查是否在描述画面。 标题说的是读名字的人与被读的名字之间的年龄关系,画面上没有可读的名字,也没有年龄,它是隐喻,不是说明。注释一讲"站一会儿"的下午,是情绪;注释二讲石头与风,是隐喻。三句话都不能直接当图注用。字体 Noto Serif CJK SC Regular,中英文同一字体家族。

8. 不良联想自查

单独看完整图后设想的第一眼联想:

  1. "被锁链拴住的三个人"。 第一版的链条画在人物前面、横过胯部,白色链环压在深色裤子上,确实可能读成"被链住"。重看照片后确认人物其实站在链条外侧、挡住了链条,于是改成链条在人物身后、被人物遮挡,只在人物两侧出现。现在读作护栏。
  2. 橙红色 + 颗粒。 动势场只用深色,不用橙色,橙红只出现在羽绒服这一块封闭色版里,边缘锐利,没有从身体拖出的任何颗粒或轨迹。
  3. 十字和墓碑感。 删去了十字和碑文,名字墙抽象成短划,拱是浅灰线脚而不是深色洞口,所以没有墓穴或墓碑的形状。
  4. 孩子头上的白色缺口。 是发箍,形状是贴着头侧的一弯窄月牙,不是伤口;检查后保留。
  5. 纸面没有红色或棕色斑点,磨损斑都是露白。

9. 逐条自检

第 2 节的 7 条限制

#项✓/✗依据
1只用代码作画✓全部图形是 src/poster.py 里的多边形、圆弧、悬链线、文字和种子噪声;库只有 Pillow + numpy
2不用图像生成模型✓没有调用任何模型、API 或网络服务
3生成程序不读照片✓grep -n "Image.open|\.jpg" src/poster.py 只命中一行注释;人物坐标是量好后手写的数字
4不用外部图形素材✓唯一外部资源是系统字体 Noto Serif CJK
5不用预装 skill / 模板 / 旧代码✓从空目录开始,没有调用任何海报类 skill
6可复现✓RandomState(20261015) 及派生种子;两次运行 md5 相同
7一张平面海报✓纸色铺满四边,无样机、无边框、无拼图、只出一张

4.2 的规格

项✓/✗依据
核心母题一个;辅助形 ≤ 3✓母题:三个背影。辅助形:拱线脚(地点)、名字场(他们看的东西)、铁链(看与不可靠近)
几何框架含圆/弧和轴线,全部元素由它推出,不画辅助线✓见第 4 节;两个圆、一条轴线、两条水平线;无任何辅助线可见
人物高度 ≤ 短边 35%✓330 / 2000 = 16.5%
留白 ≥ 50%✓程序统计覆盖率 < 1% 的像素占 94.5%
色版:断墨、磨损、露白、干笔纹,边缘清晰;正片叠底;套印错位 1–4 px✓阈值化的磨损斑、横向干笔条、针孔;蒙版 2× 超采样后边缘锐利;错位 (3,2)、(−2,3)
配色:纸 1 + 深 1 + 主题色 1–2;墨色 ≤ 4✓深、橙、黄三种墨,淡版两处
动势场恰一个,一种逻辑,密度衰减到零✓从 G 辐射,(1 − d/R)^1.5,在半径 R 处为零
手绘线只用于识别细节✓铁链(短促链环、轻重不一、偶尔断开)和羽绒服的绗缝线(纸色反白的抖动短线)
纸张有纤维、斑驳、颗粒✓低频斑驳 + 像素颗粒 + 26000 根纤维短线 + 900 个细小斑点
文字:中文标题 + 英文 + 1–2 条注释,至少一处竖排或非水平✓中文竖排、英文旋转 90°、两条双语注释;没有时间、地点、署名、水印
不良联想✓见第 8 节;链条改到人物身后

10. 实现摘要

  • 环境。 Python 3,Pillow 12.2,numpy 2.5;字体 /usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc(索引 2 = SC)。无需额外安装。
  • 总体。 每个色版是一张 0–1 的浮点覆盖率图;矢量形状先在 2× 画布(6000 × 4000)上画实心多边形,再 BOX 缩小得到锐利抗锯齿的边。最后 图像 *= 1 − 覆盖率 × (1 − 墨色) 逐版正片叠底,每版整体平移 1–4 px 模拟套印错位。
  • 纸。 均匀纸色乘以:三倍频值噪声的斑驳(±1.5%)、逐像素颗粒、随机角度的短线纤维、稀疏小斑点,再加一层极弱的冷暖漂移。
  • 色版肌理。 plate_texture():低频值噪声经平滑阶跃得到"磨损区",磨损区内按细颗粒噪声阈值挖出露白斑点;横向拉伸(1:14 或 1:8)的噪声阈值化成干笔条纹;极细噪声的高位阈值成针孔;再乘一张缓慢变化的墨量不均。阈值化保证破损边缘生硬,像拓印而不是喷绘。
  • 拱。 解析蒙版:尖拱内部 = 两个半径 R 的圆盘之交(起拱线以上)∪ 柱间矩形;线脚 = 外扩半径的同一形状减去内部,两道。深色 22% 淡版。
  • 人物。 15 个手写多边形(照片坐标),Chaikin 细分 1–2 次得到柔和的羽绒服轮廓,通过 P() 以 k = 330/690 映射到画面。版间互相挖空:橙在黄之前,头发和孩子在橙之前;孩子发箍是深色版上的纸缝。绗缝线用 hand_stroke():重采样、随机游走式的横向抖动、随机压力、随机断开,然后从色版上反白。
  • 动势场。 name_field():逐行、逐词生成短划矩形,出现概率和墨量由到 G 的距离决定;外围碎成片段和点;另加 22000 个同样衰减的小圆点;整体裁进拱内,人物外扩 6 px 处挖空;再乘一张干笔肌理。
  • 铁链。 牛顿法解悬链线参数,沿弧长每 13.5 px 一个链环,平环画成手绘椭圆、侧环画成短粗笔,8% 的环省略;链条被人物蒙版遮挡,经过名字场时留 3 px 纸边。
  • 文字。 Pillow 直接排字:竖排中文逐字居中、按 (S − 字高)/8 的字距挂在起拱线下;英文逐字排好后整体旋转 90°,字距由跨度 S 反算;注释两行。文字也走深色版,但另配一张更轻的肌理。
  • 命令。 ./run.sh。

11. 已知不足

  • 人物是符号化的剪影,头是圆块、没有脖子和手,辨识主要靠三件衣服的颜色和身高差;放大看略有玩偶感。
  • 橙红羽绒服上那只搂人的手臂只是左肩外侧的一个凸起,读得出"靠着",读不太出"搂着"。
  • 名字场在整体观看时是一块有层次的灰度纹理,近看像成行的字,但不会像真正的刻字那样有字形节奏。
  • 右侧三分之一几乎全是纸,留白是有意的,但文字区与拱之间的张力偏弱;如果再做一版,会考虑把注释也并入文字柱附近,让右侧只剩一组元素。
  • 石质线脚只有两道同心带,比照片里层层叠叠的哥特线脚朴素得多,这是为留白和秩序付出的代价。
  • 铁链在人物两侧断开,照片里它在人物身后连续;这是为避免"被链住"的误读主动做的取舍。
06

Terra 6.1

Terra 6.1 生成的海报《静默之中》
点击海报放大 · ← → 翻看
我的主观评价

三人的背影有点憨态可掬。动势场偏弱,几乎看不见。扣分项在于工程规范:既没有像其他模型那样把代码放进 src/,过程中还违规读取了本地预置的相关技能(好在并未实际调用)。

海报配文
「静默之中」In the quiet
故事
三个人共同驻足,给一个安静的时刻留出空间。
↓ 完整文件包 ZIP · 4.5 MB ↓ 海报原图 PNG · 2.8 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · poster.py · reference.jpg · run.sh
模型自述报告REPORT.md

过程合规说明:本次任务不符合全部硬性要求。 我误调用并读取了环境中预装的 photo-poster 技能说明,违反了第 2 节第 5 条。没有使用该技能的脚本、模板或生图流程,海报程序是本次新写的;但调用行为本身不可撤销,按要求整个任务应视为不合格。以下仍交付完成的图和代码,供参考。

读到的照片

照片是横向画幅。三个人靠得很近,背对镜头站在刻满文字的石墙前。左边的人穿浅黄色外套、头向内侧倾;中间的人穿橙红色羽绒服和蓝色裤子,头略朝右上方;右边的人穿深色外套,面对墙面。三人似乎都在看墙,具体看的是哪一行无法确定;手大多被身体或衣服遮挡,无法可靠判断在做什么。左侧还能看到花纹包带一类的细节。

墙上的英文提及大学成员与战争纪念,建筑有连续的哥特式尖拱,像一处可供公众驻足阅读的纪念空间。三人可能是同行者,具体亲属关系、身份和内心活动无法从照片确定;这里不替他们编造关系。

故事与取舍

故事: 三个人共同驻足,给一个安静的时刻留出空间。

保留三人紧挨着的背影、中央橙色夹克、左侧浅黄色外套、右侧深色外套和一个尖拱;三个人一起组成唯一的核心母题,尖拱是唯一具象辅助形。拱不仅标示建筑,也说明人物面对的是一个值得驻足的空间。删去铭文、连续拱廊、柱子、地砖、链条和包带,以免场景信息挤掉人物之间的距离感;没有推断人物身份。颗粒不是新增物件,而是视线的抽象运动场。

几何框架

坐标以 3000 × 2000 成图左上角为原点。框架从原照片的尖拱和人物竖向站姿推出:竖直对称轴为 x = 1340,拱的起拱高度为 y = 1060,半跨 410,拱高 585。两段外轮廓是真正的圆弧,圆心分别为 (1552.35, 1060) 和 (1127.65, 1060),半径均为 622.35;内弧与各自圆心同心,半径减去 35。拱顶汇合于 (1340, 475),两侧延至 y = 1480。

三人作为一个组团靠近轴线,鞋底和拱脚在约 y = 1480 对齐;向右上的视线场受拱内缘约束。文字从右拱脚外缘 x = 1750 向右留 16 像素,以 x = 1766 共轴排布,下方注释靠近拱脚高度。只绘制作为建筑的有厚度尖拱色版,不绘制圆心、轴线或其他构造辅助线。

配色

色值是观察照片后手写的印刷化近似色,不是生成程序从照片采样的颜色。

用途色值来源与选择
纸色#F7F7F0根据灰白石墙的冷调和光线重新调成明亮纸白。
深墨#27393E来自深色外套、头发和鞋的冷暗色;建立人物、文字骨架,淡版用于石拱和视线场。
橙红#C45D43来自中央的羽绒服,是最显眼的照片色。
浅黄#DDD68E来自左边的外套,减饱和以适合纸面。

只有三种墨色。蓝灰裤子和浅灰拱是深墨不同覆盖率形成的淡版;重叠处由正片叠底自然产生。

动势场

将三人向墙上方观看的方向抽象为一股斜向右上的视线流。深墨淡版颗粒、短断线从人物右上方开始,在离人物更远的上方逐渐稀疏、缩小并消失;总体沿同一方向,不再加入涟漪、下落等其他运动。场被上述拱的内侧圆弧裁约,并与头部留出纸面间隔。这里的斜向和强度是对视线的图形化解释,不是照片中实际可见的光束。

配文

  • 竖排标题:静默之中;其下英文:IN THE QUIET。
  • 拱脚右侧微型注释:让时间慢一些;其下英文:LET TIME SOFTEN。

两组文字都沿拱的右侧边界关系排列,标题占上方留白,注释靠近人物脚底的高度。文字说的是时间感与情绪,不是“三个人站在墙前”这类画面说明;英文是相应意译。

不良联想自查

单独看成图,第一眼更可能看到三人安静地站在尖拱下;尖拱也可能使部分读者想到教堂或纪念空间。没有画十字、墓碑、暴力行为或与身体相接的红色轨迹。初稿的颗粒更靠近人物头顶,容易像从头部冒出的烟,因此改为与身体分离的冷灰斜向视线场;局部检查时发现头部的随机露白可能被看成眼睛,又去掉了头部的大块露白。橙红色只用于外套本身。无法保证每位读者都不会产生不同联想。

逐条自检

第 2 节:硬性限制
条目结果依据
1. 只能用代码作画✓图形由手写几何、贝塞尔曲线、随机数和文字绘制;色版与纸的肌理由程序生成。
2. 不能用图像生成或预训练视觉模型✓没有调用生图、图像编辑或预训练视觉模型。
3. 生成程序不能读取照片✓poster.py 不打开照片,也不嵌入或采样照片;照片仅在作画前供人工观察。
4. 不用外部图形素材✓没有使用图标、图片、纹理或模板;仅使用本机字体。
5. 不用预装 skill、插件、以前的项目代码✗过程里误调用并读取了预装的 photo-poster 技能说明;虽未使用其脚本、模板或生图工具,但仍违反禁止调用的要求。
6. 结果可复现✓所有随机源有固定种子;同机两次生成 PNG 的 SHA-256 均为 9cca318fe8f5e5977a6860b3023b5028f1d735b3d6ac6c0e3a4fffbae3b246de。
7. 一张平面海报✓仅一张纸色铺满四边的平面 PNG,无照片拼贴、样机或外边框。
第 4.2 节:规格
项结果依据
核心母题✓三人背影是一个整体母题;具象辅助形仅一个尖拱。
几何框架✓双圆心圆弧与竖轴确定拱、人物和文字位置;没有画辅助轴线或标记。
主体尺度✓最高人物约 421 像素,占短边 2000 像素的约 21.1%。
留白✓按全部图形和文字原始蒙版非零像素的并集估算,无墨纸面约 96.8%;此统计不把纸张自身的纤维当作墨迹。
色版✓三种颜色分别生成蒙版并正片叠底,版内有细噪声、缺墨和干刷短痕,边界用 2 倍采样保持清晰。
配色✓一种纸色、一个深墨和两个照片主题色;深墨淡版不算新墨。
动势场✓一个向右上的视线流,使用点、颗粒和断续短线,向远处衰减。
手绘线✓抖动的断续短线只用于夹克、兜帽、鞋等识别细节,不描画整个轮廓。
纸张✓细颗粒、低幅斑驳与纤维均由固定随机数生成。
文字✓中文标题、英文对应和一条中英注释;中文标题竖排,没有署名或其他信息。
不良联想✓自查和调整见上;未见血迹、伤口、暴力或死亡的直接图形,但联想有主观性。

实现摘要与生成

程序使用 Python 3、Pillow 13.0.0、NumPy 2.5.4;字体为系统的 Noto Serif CJK Regular 和 DejaVu Sans。没有安装依赖或修改系统配置。

  • 纸: NumPy 固定种子的细颗粒加小尺寸随机场放大得到的轻微斑驳;Pillow 随机短线产生纤维。
  • 色版: 手写贝塞尔轮廓和圆弧组成高分辨率单色蒙版;随机细噪声、椭圆缺墨和短刮痕只作用于各色版内。三张墨版用 ImageChops.multiply 依次叠印。
  • 动势场: 在拱内按斜向位置、强度衰减及固定随机数放置圆点与短线。
  • 手绘线: 对少数衣服和鞋的短线施加固定随机抖动、断笔和轻重变化。
  • 文字: 使用本机字体绘入深墨蒙版;中文逐字竖排,英文以字间空格形成轻微疏排。
  • 蒙版以 2 倍尺寸绘制并缩小抗锯齿;最终 PNG 为无透明通道 RGB。

在本目录运行:

./run.sh

已知不足

人物被压缩为色块剪影,羽绒服、三人的位置关系和尖拱清楚,但面部、手和原照片里的包带细节没有保留;这种简化使人物比照片更像图形符号,近看略有卡通化。细小英文缩略观看时偏轻。图中的尖拱占有较明显的视觉面积,虽然它是照片的建筑片段、不是绘出的构造线,但对部分读者来说可能仍偏像框。最重要的不足是上文已说明的技能调用违规,无法通过修改输出文件补救。

07

Opus 5

Opus 5 生成的海报《名字比石头活得久》
点击海报放大 · ← → 翻看
我的主观评价

时近一小时,代码工程化程度也最高,规整地拆成了五个独立模块。拱顶直抵画布上沿,铁链也从左缘直接横贯而出,这种破界贴边的构图全场独此一份。但具象还原有些脱节,人物的头、身体与腿部缺乏整体感,最右侧人物的身躯像是被生生切掉了一半。

海报配文
「名字比石头活得久」Names outlive the stone
故事
三个人在一面刻满名字的墙前站了一会儿,名字还在往上走。
↓ 完整文件包 ZIP · 6.1 MB ↓ 海报原图 PNG · 4.4 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/figures.py · src/geometry.py · src/poster.py · src/press.py · src/texture.py
模型自述报告REPORT.md

成品:poster.png,3000 × 2000,RGB,无 alpha。生成:./run.sh(等价于 python3 src/poster.py)。同机重复运行输出完全一致(已用 md5 校验两次,并在不同 PYTHONHASHSEED 下复验)。


1. 读到的照片

场景。 一座哥特复兴式的纪念回廊:连续的尖拱券,拱内是扇形肋网,拱下的整面墙刻满人名。放大可读出 CUNNINGHAM、DAVIDSON、DAWSON、DUNBAR、EARDLEY、FOSTER 等姓氏,后面跟着 R.A.F.、R.G.A.、2nd Lt、Bord R、72nd Bn 一类军阶与番号缩写。左侧拱内上方有一个十字和一块铭文板。这是一处阵亡/失踪者纪念碑的名录墙。名字按番号分栏,密密麻麻,从地面一直刻到拱顶之下。墙前拉着一道黑色链条围栏,挂在低矮立柱之间;地面是灰色石板,前景有深浅相间的方格铺装。整张照片是阴天的冷光,石头偏冷灰带一点紫。

人。 三个人,全部背对镜头,紧挨着站在左边一个拱下、链条之前。

  • 中间:一位成年人,灰白短发,戴眼镜(镜框从侧脸轮廓外露出一小段),橘红色羽绒服,下摆露出格子衬衫,蓝牛仔裤,深色 New Balance 运动鞋。他头微微后仰并朝自己左侧偏,视线落在左前方偏高的墙面上。他的左臂环过左边那个人的肩背,手搭在对方上臂。
  • 左:一位比他矮的成年人,深色头发束起,淡柠檬黄绗缝连帽外套(帽子放下,堆在颈后),外套内露出豹纹绒衣,深蓝牛仔裤,黑色球鞋。头略低并朝中间那人偏过去,几乎靠在他肩上。
  • 右:一个孩子/少年,浅金色头发,白色头戴式耳机挂在脑后,黑色羽绒服(肩上有一道反光条),黑裤,黑鞋。站得稍微分开一点,头也朝墙面抬着。

解读(取最平常的一种)。 一家三口在参观纪念碑,站在名录墙前抬头看名字。三个人的视线方向一致,都朝左前上方;身体互相靠拢,中间那位用手臂把左边那位搂住。能认出身份的细节是:眼镜、头戴式耳机、三件不同颜色的羽绒/绗缝外套、运动鞋、链条围栏。没有更多情节可讲,照片里只有"站着、看着"这一个动作。


2. 故事

一句话:三个人在一面刻满名字的墙前站了一会儿,名字还在往上走。


3. 取舍

保留

保留的为什么
三个人合成一个剪影团块这是照片唯一的叙事:他们是一起来的,身体互相靠着。三块色版在肩部相接、共用边界,远看是一个形。
一个尖拱券(连券脚、墩柱、台阶)它既是几何框架的来源,又是"纪念建筑"的身份证明。只画一个,不画连续券廊。
链条围栏与两根立柱叙事意义:可以走到跟前,但不能再近。它是生者与名字之间那条看得见的界线,也是唯一的水平轴。
橘红、淡柠檬、蓝黑三种衣服颜色照片里最鲜活、最有人味的东西,就是这三件外套。
眼镜、耳机、鞋底、链条四处识别细节,用手绘细线。

删掉

删掉的为什么
扇形肋网、十字、铭文板、盾徽、玫瑰饰属于"通俗传统纹样"和逐一复刻,会分散视觉中心。
右侧另外两个拱、墙面分格、地面方格铺装复杂背景;保留它们会让留白消失。
牛仔裤的蓝、豹纹、格子衬衫、反光条墨色会超过四种,且与主题无关。所有腿和鞋统一进深色版。
真实的人名文字写出可读的姓名会变成文献复制,而且牵涉真人。名字被抽象成断续的刻痕。
拱内墙面作为实心色版试过把拱内填成浅色版,结果整体像一块墓碑,而且动势场没有"消失在留白里"的地方。改成只印券带+墩柱,拱内直接露纸。

辅助形共两个:拱券(含墩柱、台阶,同一个建筑形)、链条(含两根立柱)。名录墙没有单独画,它就是动势场本身。


4. 几何框架

全部坐标来自四个手量的数字,写在 src/geometry.py 顶部:

a  = 450   模数 = 拱的半跨
V  = 1020  拱的竖轴(在 3000 宽的纸上偏左)
YS = 882   起拱线
YG = 1602  地平线  ( = YS + 1.6a )

圆与弧。 拱是等边尖拱:两段圆弧,半径 R = 2a = 900,圆心就是对侧的起拱点 —— 左半弧心在 (1470, 882),右半弧心在 (570, 882)。内弧顶落在 (1020, 102.6)。券带向外加厚 0.2a = 90,外弧半径 990,外弧顶落在 (1020, 0.2):YS = 882 正是为此解出来的,使券带外缘恰好与纸的上边相切。这是画面最高处唯一的一条"硬关系",也是全图的张力来源。

轴线。 竖轴 V=1020 从拱顶穿到地面;起拱线 y=882 与地平线 y=1602 是两条水平轴。墩柱宽度 = 券带厚度 = 90,从起拱线直落到地平线。

各元素挂在哪条关系上

元素对齐关系
人物群高 1.42a = 639,宽按照片实测比例 416:690 得 385.3;群组中线与竖轴 V 共轴;脚底踩在地平线 YG 上
动势场上下界 258–1576;左右界就是内弧(逐行按 bay_span(y) 裁切),所以它的外形是拱形,但自己先衰减到零,碰不到弧线
台阶V ± (a + 2.4×90) → x 354–1686,y 1602–1624;比墩柱外挑,破掉"墓碑"读法
链条y = YG − 0.36a = 1440;从纸的左缘裁切进来,经过右墩柱中线 x=1515 的立柱,终止于 x=2235 的第二根立柱
竖排中文标题轴线 x = (V+a+90) + 1.5a = 2235 —— 与链条末端立柱同轴;末字下沿停在链条线上方 52px,立柱从链条线继续往下,把这条竖轴交到地平线高度
英文标题基线压在起拱线 y=882 上;字距拉开到正好从右墩柱外缘 x=1560 排到 x=2103
微型注释左对齐到左墩柱外缘 x=480;基线 YG + 0.35a = 1759.5

辅助线、圆心、十字、网格、标记点一条都没有画。geometry.py 只输出真正要印出来的那些轮廓。


5. 配色

全图三种墨 + 一种纸,另加同一种深墨的三档淡版(不另算)。

角色色值叠印在纸上来自照片的哪里为什么
纸#EEEFEB—回廊石材中位色 #B1AFB4,色相偏紫灰,饱和度仅 0.03照片是阴天冷光,所以取冷米白;提到纸张亮度,不让它发黄发旧
深墨#1C242B#1A2127右边孩子的黑羽绒 #1C2125(H≈205°)、深蓝牛仔 #14232E带蓝的黑,不是中性黑;用它搭骨架:剪影、头发、腿、鞋、链条、文字
主题色一#C25A33#B5542F中间那位的橘红羽绒,中位 #B35846、高光 #CD7561(H 10–11°,S 0.53–0.61)照片里最鲜活的一块。刻意把色相从 10° 推到 16°,离红更远,并提高彩度做成印刷墨——见第 8 节
主题色二#DEDAA2#CFCC95左边那位的淡黄绗缝外套 #D2D1BD/#E7E4D3(H 51–57°,S 0.09–0.10)照片里它几乎是灰的,只有在周围冷灰的衬托下才显黄。做成墨必须提彩度,否则在近白纸上消失。同一块墨也用在孩子的浅色头发上,和左边形成一条对角呼应

深墨的淡版(同一种墨放淡,不计入四色):券带与墩柱 0.26、台阶 0.34、动势场细线 0.52、动势场网点 0.40。

没有渐变,没有荧光色,没有做旧的土黄,没有第四种色相。


6. 动势场

转化的是什么。 照片里唯一的运动是三个人一起抬头、视线沿墙往上走;与它同向的是墙上的名字——一行一行往上排,一直排到拱顶的阴影里看不见。这两件事合成一件:视线上升 = 名字上升。

运动逻辑:上升(唯一一种)。 没有叠加辐射、涟漪或坠落。

实现:以 41px 为行距,从 y=1576 向上排到 y=258。每行是一串长短不一、间距很小的短横(26–84px,随高度缩短),模拟一行刻字的词;每个词周围按概率撒出 1–4 颗粗网点,越往上网点比例越高、横划越短越细——刻痕在上升中碎成颗粒。密度 p = (1−t)^1.55,t 是从 y=1540 到 y=258 的归一化高度,所以最密在三个人身后与身侧,向上单调衰减到零,在拱顶以下约 1/8 处完全消失在纸面里。行两端另有 95px 的渐隐带,让每行的左右端参差地断掉。

边界由几何框架哪一部分决定。 逐行用 bay_span(y) 取内弧在该高度的开口宽度再内收 20px。所以这片场的外形就是拱形本身,但它自己先死掉,碰不到券带——这保证了"消失在留白里"。

与主体的关系。 墙在人的后面,所以动势场按分色制版的做法从人物轮廓里挖空(trap),不是半透明地盖过去;挖空边放 4px,正好吃掉各版的套印偏移,不会在人身上露出白线。


7. 配文

原句位置为什么放这里
中文标题名字比石头活得久竖排,轴线 x=2235,字号 86,字距 110,末字停在链条线上方 52px它和链条末端立柱共轴:竖排文字 → 空隙 → 立柱 → 地平线高度,是同一条竖轴的四段。放在右侧大片留白里,让它参与秩序而不是贴上去
英文对应NAMES OUTLIVE THE STONE横排,字距拉开,基线压在起拱线 y=882,从右墩柱外缘 1560 排到 2103它把起拱线这条看不见的水平轴延伸到纸的右半边
微型注释石头冷,手是热的/the stone is cold, the hand is warm左下角,左对齐到左墩柱外缘 x=480,基线 1759.5/1801.5挂在左墩柱的延长线上,和右上的标题形成对角配重。极小字号,不抢主体

自查:它在描述画面吗。 "名字比石头活得久"没有说人、没有说站、没有说墙、没有说看——它是一句关于时间的断言,不是画面说明。能被当作说明的版本(例如"一家人在名录墙前")已被弃掉。 "石头冷,手是热的"说的是触觉与温度,画面里既没有特写的手也没有强调的石面,它是隐喻不是注解。两句都通过。我承认标题和画面里的"石头(券带)"与"名字(动势场)"主题相邻,但相邻不等于描述:它给出的是一个判断,画面给出的是一个时刻。

画面上只有这三处配文,没有时间、地点、标题栏、风格名、署名或水印。


8. 不良联想自查

构思时和成品出来后,各把整图单独看了一遍(也看了缩略图,因为误读最容易在缩略图上发生)。想到的第一眼联想和为此做过的调整:

  1. 橘红色 → 血。 这是最大的风险,因为照片里那件衣服的色相是 10–11°(偏红),而画面上另外两个人是深色。做过三件事:(a) 把墨的色相推到 16°,明确偏橘而不是偏红;(b) 橘红只出现在一个封闭的衣服轮廓里,不参与动势场、不做颗粒、不从任何身体拖出来;(c) 动势场是灰色、向上、并且从人身上挖空,所以没有任何东西像是从人身后/身下流出来。
  2. 尖拱实心块 → 墓碑。 最初的方案把拱内填成浅色版,缩略图上立刻像一块立起来的碑。改成只印券带和墩柱、拱内露纸,并加了一道比墩柱外挑的台阶、一道横穿画面的链条,现在读出来是建筑开间。
  3. 链条 + 深色站立人形 → 束缚、囚禁。 链条做成两根矮立柱之间的悬链线,明显下垂,走在人的大腿高度之前,和身体没有任何连接,立柱矮而细。它读作博物馆/纪念地的围栏。
  4. 上升的灰色点线 → 雨、雪、噪点。 这是残留风险。缓解办法是让它严格排成水平行、行距恒定、词与词之间只有很小的间隙——有行的节奏就读作刻字而不是落雪。缩略图上仍可能先看成"纹理",走近就恢复成文字。写在第 11 节。
  5. 孩子脑后的耳机圆圈 → 放大镜/单片眼镜。 把杯体缩到半径 10px 并让头带弧线直接连到它上面,不再是悬空的一个圈。
  6. 中间那位头上的白色挖空(眼镜)→ 嘴、烟斗。 早期版本把镜腿做成深色头部里的白线,加上镜片圆点后整体像一只叼着的烟斗。改成不挖空:只在侧脸轮廓外侧画一小段手绘镜圈,照片里镜片前缘本来就探出脸的轮廓。

成品整体读下来是安静的:一个开间、三个人、一片往上走的刻痕。没有伤口、暴力、死亡具象或不雅内容。


9. 逐条自检

第 2 节的七条硬性限制
#限制依据
1只能用代码作画✓所有图形是 geometry.py / figures.py 里手写的坐标、圆弧方程和多边形;所有肌理是 texture.py 里 numpy PCG64 生成的值噪声、fBm、硬阈值断墨和逐像素颗粒。库只有 Pillow(画多边形/线/字)和 numpy(噪声与叠印运算)
2不用图像生成模型✓全程无任何模型、API 或网络调用。grep -rE "requests|urllib|http" src/ 无结果;也没有用任何预训练视觉模型处理照片
3生成程序不读照片✓grep -rE "Image.open|imread|\.jpg" src/ 只命中注释与输出文件名 poster.png。观察阶段我用临时脚本放大照片、画网格、取色(都在临时目录,不在交付物里),结果只以手敲的数字进入 geometry.py(四个模数)、figures.py(人物多边形的 u,v 坐标)和 poster.py(四个色值)
4不用外部图形素材✓唯一外部资源是系统字体 Noto Serif CJK SC / Noto Sans CJK SC。没有剪贴画、图标、笔刷贴图、纹理图、现成手绘渲染库或模板
5不用预装 skill / 插件 / 旧代码✓从空目录开始,四个源文件全部本次写成;没有调用任何 skill 或模板
6可复现✓单一种子 SEED = 20251015,每条随机流用 zlib.crc32(名字) 派生(不用 hash(),因为它逐进程加盐)。连续两次运行 md5 相同;换 PYTHONHASHSEED 再跑仍相同
7一张平面海报✓只有原稿本身,纸色铺到四边;无样机、外边框、阴影、透视,不与照片拼合,只出一张
第 4.2 节的规格表
项依据
核心母题一个;辅助形 ≤3 且各有叙事意义✓母题:三人剪影团块。辅助形两个——拱券开间(纪念建筑的身份,也是几何母体)、链条与立柱(可以走到跟前但不能更近的界线)。名录墙没有另立形,它就是动势场
几何框架从主体结构推出,含圆/弧与轴线;不画辅助线✓等边尖拱的两段 R=900 圆弧 + 竖轴 V、起拱线、地平线。所有图形、文字、动势场的位置都由模数 a=450 推出(见第 4 节表)。画面上没有任何辅助线、圆心、十字、网格或标记点
人物高度 ≤ 短边 35%✓最高者 638px / 2000 = 31.9%(程序每次运行打印该值)
留白 ≥ 50%✓与纯纸层逐像素比较,最大通道差 ≤3 的面积为 90.6%(程序打印)
色版:断墨、磨损、露白、干笔纹,边缘清晰,正片叠底,套印错位 1–4px✓每版 = 覆盖率 × 肌理;肌理含低频上墨不匀、沿拉印方向的干笔条纹、硬阈值断墨(边缘和色版本身一样锐)与压印颗粒;肌理在距边 3–5px 内淡出到 0,所以边缘是实的。叠印用 sheet *= (1 − a + a·ink/255)。各版位移:石 (2,1)、台阶 (2,1)、网点 (−2,2)、细线 (−2,1)、链 (1,−1)、柠檬 (−3,1)、橘 (2,−2)、深墨 (0,0)、手绘 (1,0)、文字 (0,0)
配色:纸 + 深色 + 1–2 主题色,淡版不另算,≤4 种墨✓纸 1 + 墨 3(深墨、橘红、淡柠檬)。券带/台阶/动势场是深墨的淡版
动势场恰好一个,一种运动逻辑,网点+断续细线+散点,密度衰减到零✓一个场,逻辑只有"上升";由短横(断续轨迹)、粗网点和散开的颗粒组成;p=(1−t)^1.55 从 y=1540 单调衰减,到 y=258 为零
手绘线只用于识别细节;短笔触、轻重不一、略抖、偶有断开✓四处:眼镜圈、耳机头带与耳罩、五道鞋底短线、链条与两根立柱。hand_stroke() 把路径重采样成 ~4px 的小段,沿法线加平滑噪声抖动,笔压按另一条平滑噪声变化,每段有 3–9% 概率跳过(断笔),每条走两遍
纸张:程序生成的纤维、斑驳、颗粒✓两层 fBm 云斑 + 两个方向的长条纤维噪声 + 逐像素齿纹 + 冷暖漂移 + 2600 个随机麻点
文字:中文标题 + 英文对应 + 1–2 条微注;至少一处竖排或非水平;只有配文✓竖排中文标题 8 字、横排英文对应、一条中英双语微注。无时间、地点、标题栏、风格名、署名、水印
不良联想✓见第 8 节;六处风险逐条处理过。第 4 条(上升的点线在缩略图上可能先读成雨雪)属残留风险,不构成不适或不雅联想

10. 实现摘要

环境与依赖。 Python 3.12,Pillow 12.2.0,numpy 2.5.4(均为机器上已有,未额外安装;没有用 scipy)。字体:/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc 与 NotoSansCJK-Regular.ttc,均取 face index 2(简体中文切)。

源码

文件内容
src/geometry.py四个手量模数、等边尖拱的圆弧解、券带+墩柱的闭合轮廓、拱内开口轮廓与 bay_span(y)、人物群组的坐标变换
src/figures.py三个人的全部多边形(手敲的 u,v)、共用接缝、眼镜/耳机/鞋底的位置
src/texture.py种子与分流、各向异性值噪声、fBm、高斯模糊、色版肌理、保边肌理叠加、纸张
src/press.py3× 超采样的制版面、正片叠底印刷、手绘笔触、悬链线与链条
src/poster.py墨色、动势场、各版组装、分色挖空(trap)、排版、导出与自检打印

各部分怎么做的

  • 纸:底色 #EEEFEB 上叠两层 fBm(cell 620 / 150)做云斑与斑驳,叠两个方向的细长条噪声(1100×2.6 与 2.6×900)做纤维,叠逐像素白噪做齿纹,再用一层慢噪声让红蓝通道反向漂移(冷暖不均),最后撒 2600 个 1–3px 的随机麻点。
  • 色版肌理:ink_texture() 返回 0–1 的乘子 = 低频上墨不匀 × 沿拉印方向的干笔条纹 × 硬阈值断墨 × 压印颗粒。断墨阈值本身再被一层 cell=430 的慢噪声调制,所以磨损集中在几块区域,而不是整版撒麻子。apply_texture() 用模糊后的覆盖率做权重,让肌理在距边 3–5px 内淡出——粗糙的内部,锐利的边缘。
  • 动势场:逐行生成"词"(随机长度的小矩形),按高度衰减的概率保留;每个词旁按概率撒 1–4 颗圆点;最后再撒 150 个飞得更远的散点。全部按 bay_span(y) 裁进内弧。
  • 手绘线:hand_stroke()。路径重采样 → 求切线法线 → 沿法线加两次滑动平均后的高斯噪声(抖动)→ 笔宽按另一条平滑噪声变化(轻重不一)→ 每小段按概率跳过(断开)→ 整条走两遍。链条是悬链线上每 23px 放一个椭圆环,长宽交替(正面/侧立),每个环都用同一个手绘函数描一遍。
  • 文字:竖排中文逐字以 anchor="mm" 落在轴线上;英文逐字测宽后按目标宽度反解字距,精确排到几何边界上。文字版用最轻的肌理(几乎不断墨),保证可读。
  • 分色挖空:深墨是最上面的版,所以橘红和柠檬从它下面让开(留 2px 搭边);柠檬再从橘红下面让开;动势场和链条整个从人物轮廓外 4px 让开。这样叠印不会把墙上的刻痕透到人身上,也不会在衣服接缝处叠出浑色。
  • 叠印与套印:每版 np.roll 若干像素再 sheet *= (1 − a + a·ink/255)。

生成命令

./run.sh          # 或 python3 src/poster.py

11. 已知不足

  1. 缩略图上的动势场。缩到 300px 宽看,上升的点线会先读成"纹理/雨雪",要走近一点才恢复成一行行刻字。行距再小一点、词再长一点也许能改善,但那会让它在原寸下变成一块实色。
  2. 眼镜太小。那一小段手绘镜圈在原寸下是对的,在整图缩览时等于不存在。想让它在远观时也成立,就得把它画大到失真,所以我选了保留真实比例。
  3. 耳机仍有一点"包带"感。头带加耳罩的组合在某些尺寸下像斜挎包的带子和挂环。换成实心挖空会更明确,但孩子的头发是浅色版,白色挖空在上面读不出来。
  4. 左边那位的头与橘红外套粘在一起。深墨的头、深墨的头发、紧挨着的橘红肩部,中间没有露白,远看是一团。照片里本来也是贴着的,但平面化之后少了明暗过渡,这里损失了一点可读性。
  5. 动势场左下角偏稀。行起点的随机偏移加上人物挖空,使 x 600–800 / y 1200–1550 一带明显比右侧空。这是随机的结果,不是设计。
  6. 券带顶部的干笔方向。干笔条纹是整版统一的近竖向,在拱顶那一段它是横切券带而不是顺着券带走。要做对需要让噪声沿弧长参数化,目前没有做。
  7. 鞋被简化成楔形。三双鞋都只是几个多边形,原照片里鞋型(尤其中间那位的大码跑鞋)的特征没留住。
  8. 纸纹偏弱。在屏幕上按 100% 看得到纤维和麻点,缩览时纸几乎是平的。印出来应该正好,但作为屏幕交付物略保守。
08

DeepSeek 4.1 Flash

DeepSeek 4.1 Flash 生成的海报《念着,就还在》
点击海报放大 · ← → 翻看
我的主观评价

深色三线拱极具张力,动势场如同一股升腾弥散的浓墨,方向感在全场数一数二。遗憾的是人物姿态略显僵板。生成过程中前前后后迭代了 14 轮,骨子里是个追求完美的偏执狂。

海报配文
「念着,就还在」Say it and it stays
故事
三个活着的人仰头读一墙死者的名字,读的动作本身就是让名字还在。
↓ 完整文件包 ZIP · 9.5 MB ↓ 海报原图 PNG · 7.8 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/poster.py
模型自述报告REPORT.md

程序生成的海报。全部图形由代码里的坐标、曲线和数学关系画出;全部肌理由固定种子的噪声和随机数生成。生成程序 从不打开 reference.jpg:照片只用肉眼看,观察结果以手写数字(坐标、色值、比例)写进程序。

生成命令(可重复运行,输出逐字节相同):

./run.sh          # 等价于 python3 src/poster.py

1. 读到的照片

  • 场景:一座纪念建筑的内部回廊。整面石墙从上到下刻满了成排的人名,人名前后带着军衔缩写(Lt Capt 2nd Bn RAF M.C. 之类)。这是苏格兰国家战争纪念馆(爱丁堡城堡)的姓名墙。墙前有一道挂在墙上的铁链拦挡,地面是浅色石板。
  • 人物:背影,三个人,并排站着看墙。都面朝墙,看不到脸。
    • 左边一人(个较矮,戴兜帽的浅黄绿色羽绒服),深色头发,深蓝长裤,深色鞋、露出白袜;肩上搭着一件豹纹的东西(围巾或包)。
    • 中间一位年长男性,灰色短发,戴眼镜(从侧面看得到镜腿),砖红色/铁锈色的横向绗缝羽绒服(帽子放下),下摆露出一截格纹衬衫,蓝色牛仔裤,灰色 New Balance 运动鞋。
    • 右边一人,浅棕灰色头发,深色(近黑/深藏青)羽绒服,领口有浅色的环状物(耳机或浅色领口/兜帽),黑色长裤和黑鞋。
  • 关系与姿态:三个人贴得很近,肩膀几乎挨着,中间的人略靠前也最高——最平常的解读是一家三口或两代人一起来看这块墙。三个人都在向上读墙上的字,头略微抬起;没人交谈,没人比划,手自然垂下。
  • 视线:三人都落在墙上密排的名字上,落点略高于自己的头顶——这正好是墙上名字排得最密的地方。
  • 能认出身份的细节:铁链拦挡;中间那位男性的眼镜;右边那人颈/头部的浅色环(耳机);三人的鞋(都是深色、浅色鞋底的步鞋)。

2. 故事

一句话:三个活着的人仰头读一墙死者的名字,读的动作本身就是让名字还在。

3. 取舍

保留:

  • 拱。照片里最有辨识度、也最有叙事的形态不是人,而是那个把整面名字罩住的哥特尖拱。它同时给了整张海报一套现成的几何(两心尖拱的两个圆心就落在两个拱脚上)。
  • 三个人并排的背影、身高差、以及"中间那人最高、最靠前、穿最暖的颜色"这一组关系。
  • 铁链拦挡——它是"我们"与"名字"之间那条线。
  • 三处能认出原物的细节:眼镜、右边人头上/颈边的浅色环、铁链。

删掉:

  • 墙上成千上万的名字本身。逐字复刻会变成写实插画,也不可能用程序画出真实姓名。它的"多"改由动势场的网点承担(见第 6 节)。
  • 拱肩上的石雕花叶。属于"通俗的传统纹样",且与叙事无关。
  • 拱柱上的石缝、地砖的花纹(照片里地砖是格纹的)、豹纹围巾、格纹衬衫下摆、鞋上的品牌字母。这些都是照片的"噪点",删掉之后主体只剩一个母题。
  • 右侧两跨拱门和画幅外的一切。

为了让"人"在只有 35% 短边高度的尺子里还能被认出来,我把三件外套平涂成三块色版,而不是画绗缝线:一眼能分出"黄—橙—黑"三个人,比画清楚每一道车线更重要。

4. 几何框架

整张图只有一套结构:一个两心尖拱。

  • 轴线:竖直线 x = 1300(= AXIS),整幅画面唯一的中轴。
  • 起拱线:水平线 y = 1560(= SPRING)。它同时是两个圆心所在的线、两个拱脚的线、和桌面上的排版基线。
  • 两个圆:圆心 (850, 1560) 与 (1750, 1560),即在起拱线上、轴线左右各 450;两圆心距离 900 = 拱的跨度。
  • 外圈:半径 R_OUT = 900(= 跨度,标准等边尖拱)。以右圆心为心、900 为半径的弧从左拱脚升起,以左圆心为心、900 为半径的弧从右拱脚升起,两弧在轴线上交于拱尖 (1300, 780.6)。也就是说:两个圆心就是两个拱脚。
  • 中圈:半径 845(一组线脚)。
  • 内圈:半径 790。它的拱尖在 (1300, 910.7),在起拱线上开口 960–1640,这是"洞"。
  • 拱腿:x = 850 / 1750(外)与 x = 960 / 1640(内)四条竖线,从起拱线下到台基线。
  • 台基线/地线:y = 1934,连接两个外拱脚。
  • 铁链:与拱同一个半径 900 的圆,圆心在轴线上、外拱尖正下方 (1300, 890)。它挂在两侧内拱腿之间((960,1673) 到 (1640,1673)),最低点落在轴线上 (1300,1790)——是拱在水下的倒影。
  • 主体(人):中间那人的中线就是轴线 x = 1300;左边一人在 x = 1185,右边一人在 x = 1412;三人脚底都在台基线 y = 1934 上(中间那人 1934,左右 1922 / 1918,略有前后错位)。
  • 动势场:圆心式衰减的"核"落在轴线上 (1300, 1410),即中间那人头顶上方 67 像素;横向被内圈切住。
  • 排版:竖排中文标题的列心在 x = 2200 = 右圆心 + R_OUT·cos60°(右弧 60° 方位的延长线上),列顶落在过外拱尖的水平线(y = 780.6 − 24);英文标题的基线落在起拱线上(y = 1554);左边竖排中文注释的列心在 x = 470 = AXIS − 830,列顶与右侧标题同一条水平线。四组文字因此都挂在拱的轴线、拱尖水平线或起拱线上。

一条辅助线都没有画出来:没有圆心、没有十字、没有网格、没有标记点。上面这些线只用来决定元素的位置和边缘。

各元素的对齐关系一览:

元素对齐到
三个人中轴 + 台基线
拱两个圆心在起拱线、两个拱脚在圆心
铁链与拱同半径的圆,最低点在中轴
动势场核在中轴,横向被内圈切边
中文标题(竖)右弧 60° 延长线,顶端在外拱尖水平线
英文标题起拱线(基线)
中文注释(竖)与外拱脚对称的左边界,顶端与标题同高

5. 配色

一共 四种墨:纸 + 深色 + 两种主题色(长裤用的是深色的淡版,不另算一版)。

用途色值来自照片哪里为什么
纸#F2EFE5 (242,239,229)石墙受光面和石板的浅灰(取样约 (165,163,167))照片整体是阴天冷灰调,但石头的灰里有微弱的暖。取"象牙白",比石头亮、比石头暖,保持清爽不发旧。
深色#212830 (33,40,48)右边那人的深藏青羽绒服与刻字阴影(取样约 (33,44,51))用同一个颜色同时当剪影、头发、鞋、最深的版和全部文字,构成整个画面唯一的骨架色。带一点蓝,是照片里那种阴天石头和黑羽绒共同的冷。
主题色一#C25232 (194,82,50)中间男性的砖红/铁锈色羽绒服(中间调约 (172,69,51),高光约 (199,106,89))照片里最鲜、最暖、唯一的"活"颜色。它被放在正中间、也是最靠前的人身上,所以全图只有一个暖点。
主题色二#E4DCA0 (228,220,160)左边那人浅黄绿色羽绒服(取样约 (220,216,195) / (207,201,168))比原色略提纯,免得它在象牙纸上退化成白色而看不出是一版。它和橙色同属暖黄一系,不冲突。
(淡版)深色 × 0.62三人的深色长裤长裤在深色版上降到 62% 的着墨,于是剪影有了"头发/外套 = 最黑、裤子 = 中灰"的层次,仍然是同一版墨。

刻意避开的:荧光橙、常规渐变、多色堆叠、做旧的土黄、传统的红金配色。

6. 动势场

转化的是照片里的哪种关系:三个人都在仰头向上读名字,而名字是一排排往上排的。所以取"上升"这一种运动逻辑。

做法:以中轴上的一个"核" (1300, 1410)(正中间那人的头顶上方)为中心,密度按 exp(−(r/205)²) 向四面八方衰减,横向被拱的内圈切边,离开核心约 470 像素处密度降到零,完全消失在拱内的纸白里。场由三样东西组成:

  1. 粗糙的网点:25 像素间距、带抖动的点阵,点半径 ∝ √密度(核心约 3.3 px,向外缩到消失)。这是"多",是名字的数量。
  2. 断续的轨迹:130 条向上伸的细线,沿线按密度撒下小点和短竖划;每往上一段,间隔变大、笔变细、随机断掉。这是"上升"。
  3. 颗粒:按密度撒的散射小点,越远越稀。

边界由几何框架决定:核在中轴线上;横向边界是拱内圈(半径 790 的两段弧);下边界不是直线,而是三个人物的轮廓——人物被从场里挖掉(轮廓外扩 12 像素),所以场是"贴着人的头顶升起来"的,而不是被人挡住。

安全考虑:场只用深色墨、只有短划和圆点、方向向上、整片位于所有人物的头顶以上,没有任何红橙色的拖尾贴着身体(见第 8 节)。

7. 配文

位置原文
右侧,竖排念着,就还在
右侧,横排(起拱线上)SAY IT AND IT STAYS
左侧,竖排我们比石头更会遗忘
右侧,横排(英文标题下方)WE FORGET FASTER THAN STONE
右侧,横排名字比人久
右侧,横排A NAME OUTLASTS ITS SAYER

为什么放在那里:竖排中文标题的列心落在右弧 60° 的延长线上、列顶与拱尖等高,用拱自己的角度定位;英文标题直接坐在起拱线上,成为那条看不见的线的可见部分;左侧竖排注释与右侧标题同一条顶线,把中央的拱夹在两组文字之间;两条微型注释收在右下,不越过英文标题的左边界。全图没有时间、地点、标题栏、风格名、署名和水印。

是否在描述画面:逐条自查。"念着,就还在"说的是"说出来/念出来"与"还在"的关系,不是画面里有什么;"我们比石头更会遗忘"是用石头作比,讲的仍然是记性,不是说"这里有石头";"名字比人久"和 A NAME OUTLASTS ITS SAYER 说的是名字与人的时间差。改写过两轮,删掉了像"三个人站在纪念碑前读名字"这类一读就是画面说明的句子。

8. 不良联想自查

成品出来之后,单独看一遍整图,设想读者第一眼会怎么读:

  • 最危险的读法:核心里那团深色颗粒贴着人物头顶,可能被读成"烟"、"灰"、"虫群",甚至被读成"伤口上落的蝇"。为此做过三件事:(1) 颜色不用红/橙,只用与剪影同色的冷石板蓝,和人物衣服同族,不会被当成血;(2) 方向统一向上、不是从人身上往外拖,也不是往下滴;(3) 人物轮廓外扩 12 像素把场挖掉,所以颗粒和人之间始终有一圈干净的纸,没有任何东西贴在人身上。核心密度也调低了两轮,从"一团"降到"一片"。
  • 早先一版把场的核心直接压在人物头顶、密度又高,渲染出来像一棵"灌木",同时人物的头几乎埋进去。已改成核上移、峰值降小。
  • 铁链原本挂在人物腰的高度,渲染出来像三个人扶着栏杆。已下移到臀腿之间,并让它从人物身后穿过。
  • 右边那人的浅色耳机线,第一版画成两笔交叉,看着像个"叉"或绷带。已改成从头上一道弧 + 两侧耳罩,读作耳机。
  • 其余:没有血迹、伤口、武器、死亡符号;橙色只出现在一件平平整整的外套色版上;拱是建筑,不是十字架或墓碑;整图没有印章、没有民俗纹样、没有卡通或 3D 感。

9. 逐条自检

第 2 节的 7 条硬性限制
#要求结果依据
1只能用代码作画✓全部形状是 src/poster.py 里的坐标与公式(圆弧用 |dist−R| 的解析距离场写、人物是手写的归一化折线经 Catmull-Rom 光滑);纸纤维、斑驳、断墨、干笔、网点全部由 RandomState(1971) 的噪声生成。
2不能用图像生成模型✓没有调用任何模型、API 或网络服务;没有 import 任何视觉/深度学习库。
3生成程序不能读取照片✓poster.py 里唯一的文件读写是 …save("poster.png"),除此之外不打开任何文件(字体除外)。照片的观察是另写的一次性脚本,结果只以字面量出现。
4不用外部图形素材✓没有剪贴画、图标、SVG 库、笔刷、贴图、海报模板;唯一外部资源是系统字体 Noto Serif CJK SC 与 Noto Sans CJK SC。
5不用预装 skill/插件/旧代码✓本目录从空的开始写起,只用 Python 3 + Pillow + NumPy;没有调用任何 skill。
6结果可复现✓固定种子 SEED = 1971,没有其他随机源;连续两次 ./run.sh 得到相同 md5 7f60c8f8490634b399718d96c99816a7。
7一张平面海报✓只有海报本身,纸色铺满四边,没有画框、墙面、阴影、透视、外边框,没有和原照片拼在一起,只输出一张 3000×2000 的 PNG。
4.2 的规格
项结果依据
核心母题✓一个:拱门里的三个人。辅助形恰好三个,每个都有叙事意义——拱(纪念馆的建筑,也提供全部几何)、铁链(我们与名字之间那条线)、上升的场(名字还在被念)。
几何框架✓从主体结构推出:两心尖拱的两个圆心就是两个拱脚。含多条圆弧和一条中轴线、一条起拱线。所有图形、文字、动势场的位置都由它推出(见第 4 节表)。没有画任何辅助线、圆心、网格、标记点。
主体尺度✓中间那人高 470 px = 短边 2000 的 23.5%(≤ 35%);左右两人 402 / 386 px,为 20.1% / 19.3%。
留白✓程序统计:总着墨覆盖为零的像素占 93.5%,覆盖 ≤ 0.02 的占 94.1%(≥ 50%)。
色版✓四种墨各一版(纸、深色、橙、浅黄),长裤是深色的淡版不另算。每版内部有:大块磨损斑(低频噪声阈值)、通版细孔(高频噪声,作用于细线)、成片的干笔断墨(230 单元的横向长条噪声 × 细噪声)、密度不匀(110 单元);边缘由距离场/矢量给出,抗锯齿后在 2 px 内落定,而磨损被限制在离边 ≥ 1.5 px 的内部,所以边缘保持锐利。各版以正片叠底叠印,套印错位:浅黄 (+2,−1)、橙 (−3,+2)、深色 (+1,+2),全部落在 1–4 px 内。
配色✓纸色 1 + 深色 1 + 主题色 2 = 4 种墨,不超。
动势场✓恰好一个,只有"上升"一种逻辑;由网点 + 断续细线 + 颗粒组成;密度随离核心的距离衰减到零(exp(−(r/205)²),约 470 px 处归零),横向边界由拱内圈给出。
手绘线✓只用在识别细节:右边人的浅色耳机环与领口、中间那位的眼镜腿、铁链的链环、以及三件外套袖子与衣身的接缝。全部是短促、反复、轻重不一的笔触(每条线画 1–3 遍、每遍带随机抖动、并被随机切成 1–3 段而断开)。
纸张✓由 5 个倍频的值噪声 + 纵向/横向长纤维噪声 + 纸浆斑点 + 逐像素细颗粒叠成,不是纯色。
文字✓中文标题一句「念着,就还在」+ 英文对应 SAY IT AND IT STAYS;微型注释两条(我们比石头更会遗忘 / WE FORGET FASTER THAN STONE;名字比人久 / A NAME OUTLASTS ITS SAYER)。竖排中文两处(右侧标题、左侧注释),且竖排里的逗号按中文竖排习惯移到字格右上角。画面上只有配文本身。
不良联想✓见第 8 节。已按自查调整了三轮(场的方向与密度、铁链的高度、耳机线画法)。

10. 实现摘要

语言/库:Python 3,NumPy(噪声、距离场、正片叠底),Pillow(多边形、文字、重采样滤波)。 字体:/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc(index 2,Noto Serif CJK SC,用于中文)与 NotoSansCJK-Regular.ttc(index 2,用于拉丁字母)。系统已装,不下载。

流程(src/poster.py,一个文件,652 行):

  1. 纸 make_paper:以 #F2EFE5 为底,乘上一层亮度场——5 个倍频的值噪声(纸浆的云斑)、两组各向异性的长条噪声(纵横纤维)、稀疏的黑/白斑点、逐像素细粒,再加上一点暖冷漂移和整体的左上到右下微光。值噪声用"小随机矩阵 + 双三次放大"实现。
  2. 色版遮罩:几何量(拱、拱腿、台基、铁链)直接用解析式距离场 |‖p−c‖−R|−w/2 光栅化,天然抗锯齿;人物用 3 倍超采样的多边形(归一化折线 → Catmull-Rom 闭合曲线)画完再 LANCZOS 缩回。人物分三版:深色版(三个头、三双鞋、深色外套)、橙色版(中间那件的羽绒服)、浅黄版(左边那件),长裤落在深色版的 62% 淡版上。
  3. 动势场 motion_field:网点是带抖动的网格,点半径 ∝ √密度;轨迹是 130 条向上生长的折线,沿线按密度撒点/短划,间隔随高度加大,随机断;颗粒是散射小点。最后乘上"人物轮廓外扩 12 px"的遮罩把人挖空。
  4. 手绘线 hand_lines:返回两张遮罩——add(画在纸上的墨,如链环)和 knock(从已有墨色里"刮"出来的白,如耳机、眼镜腿、衣缝)。每条线反复画几遍并随机断开。
  5. 色版肌理 plate_texture:一次腐蚀场乘到遮罩上。用 MinFilter+模糊先求出"离边 ≥ 1.5 px 的内部",磨损斑与干笔只作用在这块内部,细孔通版作用,因此内部粗犷、边缘锐利。
  6. 正片叠底 over:out = base × (coverage×ink + (1−coverage)),每版带 1–4 px 的位移;叠印顺序浅黄 → 橙 → 深色。
  7. 输出 RGB PNG(无 alpha 通道)3000×2000。

运行:./run.sh(或 python3 src/poster.py),约 13 秒,需要 NumPy 与 Pillow。程序会打印用墨覆盖率的自检数字。

11. 已知不足

  • 三个人是"平涂的剪影 + 三件外套",不是量着照片画出来的。比例(身高、肩宽、腿长、头身比)是照着照片量的,但轮廓是通用的"背影"模板,因此少了个体特征:看不到绗缝、看不到格纹衬衫下摆、看不到豹纹围巾。远看读作"三个穿外套的人",近看读不出是谁。
  • 动势场读得出"上升",读不出"名字"。它由网点、短划和颗粒组成,密度、方向都对,但一个不知道原照片的人更可能读成"灰尘/虫群/雪",而不是"名字"。想过把颗粒做成微型字形,怕变成噪点而放弃——这是本次最想改进而没能解决的一点。
  • 纸的质感偏轻。100% 放大会看到纤维和颗粒,但缩到屏幕尺寸几乎就是一块平色;可以再强一点。
  • 三圈拱线的重量不均:外圈线最宽,反而被磨损场吃掉了最多,看上去比内圈线浅。留着当作"石头外沿被摸旧了",但严格说是一次不一致。
  • 构图押得很大:画面上方约 39% 的高度是纯白,全图 94% 是空白。这是规格要求的方向,但如果读者不接受这个尺度,整张图就显得空。
  • 右边那人的浅色耳机环,在小尺寸下更像一顶帽檐。
09

Gemini 3.8 Flash

Gemini 3.8 Flash 生成的海报《万千姓名,皆曾拥有今日的体温》
点击海报放大 · ← → 翻看
我的主观评价

大面积的晦暗阴影把人物困在其中,使纸面应有的通透留白大打折扣;配文篇幅过长且过于抒情,读来更像电影画外音,而非平面海报的洗练标题。尖拱左右两弧在顶部甚至未能合拢,留下一道尴尬的 V 形裂隙。不过它专门手写了一段 C 语言扩展来做底层纹理生成,工程思路着实别具一格。

海报配文
「万千姓名,皆曾拥有今日的体温」Ten thousand names once held the warmth of this very hour
故事
在冰冷肃穆的历史纪念石壁前,一家三口并肩伫立,以活泼而鲜活的日常体温,凝视并抚慰着石壁上万千长眠的姓名。
↓ 完整文件包 ZIP · 5.2 MB ↓ 海报原图 PNG · 3.5 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/render_poster.py · src/textures.c · src/textures.so
模型自述报告REPORT.md

本说明报告依据 REQUIREMENTS.md 第 5 节的 11 项规定撰写,详细阐述从参考照片 reference.jpg 提炼视觉母题、推导几何秩序、构建纯程序生成代码管线及完成全套交付物的完整过程。


1. 读到的照片

1.1 事实与平常解读
  • 主体与人数:照片主体位于中下部前方,共有三人,均为正背影伫立姿态,从左至右依次为:
    1. 左侧女性(母亲形象):身穿亮明黄色中长款羽绒夹克,留有深色短发/齐肩发,右肩或手臂挽着一只黑白花纹布包,下身着深色修身长裤与深色平底鞋。
    2. 中央男性(父亲形象):身穿鲜明的橙红色横向宽衍缝羽绒服(面包服),身材较魁梧宽厚,黑色短发,下身穿深蓝灰色牛仔长裤,脚穿深色厚底鞋。
    3. 右侧青年(子女/青年学生形象):身穿黑色修身羽绒夹克,身材较为高挑瘦长,头上佩戴一副非常醒目的头戴式大耳机(耳罩与头梁弧线轮廓分明),下身穿黑色修身窄腿裤,脚穿深色平底球鞋。
  • 人物关系与姿态解读:三人的肩肘彼此贴近,紧密并肩站立,父亲居中稍显厚重,母亲微侧依附,青年直立静听,构成极为典型且平常的三口之家。三人双手自然下垂或轻微插兜,毫无浮夸动作,身体重心扎实稳定,呈现出专注、肃穆、沉思的凝视姿态。
  • 视线与视点:三人的视线高度一致,全部笔直投向正前方高耸入云的巨大垂直石质纪念墙壁。
  • 场景空间性质:这是一座带有典型中世纪哥特式建筑风格的纪念堂或欧洲历史大教堂内部(如阵亡将士纪念堂或历史名录殿堂)。背景是一堵平整而庄严的浅灰色石灰石石壁,石壁上密密麻麻刻满了被纪念者的姓名与生卒铭文;上方是层层嵌套的哥特式尖券拱顶(Pointed Arch Vault)与纤细修长的束柱立柱(Archivolts & Colonnettes);三人正前方横跨着一根低矮的金属隔离悬链线(Catenary Chain)与接地矮桩,清晰地界定出生者驻足的现实世界与承载历史记忆的神圣壁面之间的临界距离。
  • 能认出身份的核心识别细节:
    • 父亲羽绒服的横向饱满衍缝(Baffles);
    • 母亲鲜明的亮黄色外套与右侧花纹布包;
    • 青年头顶极为现代的头戴式大耳机(Headphones);
    • 隔开观者与石壁的低矮悬链与立柱(Barrier chain & stanchions)。

2. 故事

“在冰冷肃穆的历史纪念石壁前,一家三口并肩伫立,以活泼而鲜活的日常体温,凝视并抚慰着石壁上万千长眠的姓名。”


3. 取舍

3.1 保留的元素及理由
  1. 核心母题:三口之家背影组合(Exactly 1 Core Motif)
    • 理由:这是原照片最具辨识度、最具情感张力与时代特征的视觉母题。橙红与亮黄的现代冲锋/羽绒服饰,与厚重古老的灰色石壁形成强烈的历史时空对比,是“当下生命体温”对“过去历史冰冷”的直接凝视。
  2. 辅助形 1:哥特式尖顶纪念碑/石壁(Gothic Pointed Memorial Tablet)
    • 叙事意义:将原照片中无限延伸的平面石墙,提炼为一座比例严谨、带有哥特式尖顶的纪念碑拓片版,作为历史长河与万千死难者姓名的永恒物理承载体。
  3. 辅助形 2:多重同心哥特尖券拱肋与束柱(Concentric Gothic Pointed Archivolts & Colonnettes)
    • 叙事意义:将大教堂庞大宏伟的建筑体量转化为纯粹的几何同心尖拱线条,在画面左侧构筑神圣庄严的建筑殿堂与精神庇护所,赋予构图以崇高的垂直上升力。
  4. 辅助形 3:悬链隔离链条与矮桩(Catenary Barrier Chain & Stanchions)
    • 叙事意义:保留了照片中生者与纪念碑之间的物理分界,隐喻生死之间、当下与历史之间那道不可逾越却又仅咫尺之遥的肃穆界限。
3.2 舍弃的元素及理由
  1. 舍弃石壁上成千上万个具象的英文字母雕刻:
    • 理由:逐一临摹细小字母会沦为写实插画与杂乱的视觉噪点;改用古典碑刻“石拓”(Stone Rubbing)颗粒质感与半色调网点动势场来抽象隐喻万千姓名,符合现代平面设计与古籍图录的意境。
  2. 舍弃周围散落的杂乱游客、现代地面瓷砖缝隙与电线开关:
    • 理由:剔除一切偶然性噪点,使画面完全聚焦于三口之家与纪念碑之间的精神对话。
  3. 舍弃复杂的环境透视与右侧侧殿漫射杂光:
    • 理由:将复杂的空间透视重构为扁平化的正投影几何框架与辽阔的象牙白宣纸留白(Whitespace ≥ 85%),为观者留下充裕的心理想象空间。

4. 几何框架

全图所有形态、色版边缘、动势场与版式文字,均严格推导自一套看不见但极其严谨的等边哥特式尖券几何矩阵。画面上不绘制任何辅助线、圆心与十字标记。

       Apex (Y=280)
           /\
          /  \
         /    \        Concentric Archivolts (Radii: 480, 515, 550, 580)
        /      \
       /        \
      /  Tablet  \     Pointed Stele Tablet (W=660, Apex Y=388, Base Y=1620)
     /   (Rubbing)\
----|--------------|--- Springline (Y=1120)
    |  *Figures*   |    Father, Mother, Youth (Centered at X=960, H=520)
====|==============|=== Base Contact Line (Y=1620)
    C_L           C_R
 (X=480)       (X=1440)
4.1 几何参数与数学推导
  • 画布规格:W = 3000 px, H = 2000 px(2:3 横构图)。
  • 主要构图纵轴(Primary Axis):X_arch = 960.0 px。位于画面横向约 0.32(经典左侧三分偏置黄金位),为右侧留出辽阔空灵的纯净留白。
  • 拱券基准起拱线(Springline):Y_spring = 1120.0 px。
  • 地面基准线(Base Line):Y_base = 1620.0 px。
  • 等边哥特式尖券(Equilateral Pointed Arch)生成矩阵:
    • 尖券基准跨度(Span):S = 960.0 px。
    • 左弧圆心:C_left = (X_arch - S/2, Y_spring) = (480.0, 1120.0)。
    • 右弧圆心:C_right = (X_arch + S/2, Y_spring) = (1440.0, 1120.0)。
    • 同心复合拱肋(Archivolts)同心半径:r ∈ 480.0, 515.0, 550.0, 580.0 px。
    • 任意半径 r 的尖券顶点纵坐标解析式:
    y_apex(r) = Y_spring - √(r^2 - (S/2)^2) = 1120.0 - √(r^2 - 480^2)
    • 主内拱(r=480)顶点:Y_apex = 1120 - 480 · frac√(3)2 ≈ 704.3 px;
    • 最外层拱券(r=580)顶点:Y_apex = 1120 - √(580^2 - 480^2) ≈ 794.1 px。
  • 哥特尖顶纪念石碑(Pointed Stele Tablet):
    • 碑身宽度:W_tab = 660.0 px,对称分布于 X ∈ [630.0, 1290.0]。
    • 石碑起拱线:Y_tab_spring = 960.0 px。
    • 碑尖圆弧半径:r_tab = 660.0 px,左圆心 (630.0, 960.0),右圆心 (1290.0, 960.0)。
    • 石碑尖顶:Y_tab_apex = 960 - √(660^2 - 330^2) = 960 - 330√(3) ≈ 388.4 px。
    • 碑底延伸至基座线 Y_tab_base = 1620.0 px。
  • 人物主体对齐关系:
    • 人物中心线与主轴完全重合(X_main = 960.0 px);
    • 父亲位于 X ≈ 960,头顶 Y = 1100,脚底 Y = 1620,总高度 520 px;
    • 母亲位于 X ≈ 870,头顶 Y = 1130,脚底 Y = 1606,总高度 476 px;
    • 青年位于 X ≈ 1066,头顶 Y = 1150,脚底 Y = 1606,总高度 456 px;
    • 人物主体最大高度 520 px,占画面短边 2000 px 的比例为 26.0%(严格满足 ≤ 35% 限制)。
  • 水平隔离链条对齐:
    • 悬挂立柱位于 X=600 与 X=1320(与石碑左右边缘各缩进 30 px);
    • 悬链线下垂弧顶位于 X=960, Y=1276,横向贯通主体群像。
  • 排版对齐网格:
    • 中文大标题双列错落排布于右侧留白主轴:右列位于 X = 2050.0,左列位于 X = 1960.0;
    • 英文对照标题横向坐落在底部水平轴线:Y = 1480.0 与 Y = 1515.0;
    • 右侧纵向微型注释 1 位于主标题左侧留白过渡线:X = 1850.0;
    • 左侧纵向微型注释 2 位于左侧束柱与纪念碑之间的象牙白中轴:
    X_mid = 480.0 + (630.0 - 480.0)/(2) = 555.0 px

5. 配色

全图严格采用纯纸基色 1 种 + 墨色 4 种(满足“全图不超过四种墨色”),所有色彩均严格提炼自原照片的最具精神内涵之区域。

色彩角色色值代码 (Hex / RGB)照片取色来源精神内涵与视觉功能
纸色基底 (Paper Base)#F7F5EE
rgb(247, 245, 238)
大教堂石壁高光与穹顶冷暖漫射光的平衡值象牙温润白。具有明亮清爽的呼吸感,杜绝传统泛黄做旧,由程序生成微米级植物纤维与木浆颗粒。
深色骨架 (Dark Slate)#1C232A
rgb(28, 35, 42)
青年深色羽绒服、三人的黑发、裤腿、鞋履及字体普鲁士炭墨青黑。作为画面的结构重力骨架,沉稳坚定,承担高反差轮廓与文字排印。
主题色 1 (Vermilion Orange)#DB502A
rgb(219, 80, 42)
父亲身穿的面包羽绒服面料朱砂暖橙。象征滚烫的人间生命体温、父辈的庇护与当下的鲜活存在。
主题色 2 (Citron Ochre)#CABD62
rgb(202, 189, 98)
母亲身穿的中长羽绒服外层面料香橼秋黄。明亮柔和,与朱砂橙构成和谐的双色调,赋予画面生动的日常光感。
辅助墨色 (Stone Grey)#848E98
rgb(132, 142, 152)
大教堂石壁砂岩与冷色石柱的平均反射色板岩灰墨。专用于石碑拓片色版、同心拱券肋线与动势场上升粒子,表达历史的静穆与尘埃。

6. 动势场

  • 转化的运动与视线逻辑:照片中虽然人物身体静止,但视线与精神力量正从人物头部不可遏制地向高耸入云的铭文石壁与穹顶延伸。因此,海报选择且仅选择一种纯粹的运动逻辑: “记忆与凝视的垂直升腾场”(Vertical Ascent of Memory and Gaze)。
  • 微观元素构成:动势场完全由程序生成的三种几何颗粒与线性要素融合而成:
    1. 粗糙半色调网点(Halftone Dots):直径 6 sim 10 px,带有程序随机相位微扰;
    2. 断续垂直游丝细线(Broken Vertical Striae Lines):线宽 1.5 sim 2.5 px,呈现如重力倒流般的上升轨迹;
    3. 弥散记忆尘埃散点(Diffuse Specks):微小随机散点。
  • 几何边界与空间衰减:
    • 动势场严格约束在哥特尖顶纪念碑内侧与主拱券下沿所围合的垂直几何走廊内(X ∈ [630.0, 1290.0]);
    • 垂直衰减规律:自人物肩颈上方 Y = 1180.0 起始聚集,在 Y ∈ [900, 1100] 最为密集强烈;随着高度向上攀升至尖券顶点(Y → 280.0),颗粒与细线密度平滑衰减至零,自然溶入广袤的象牙白宣纸留白之中。
  • 色彩限定:严格使用 #848E98(板岩石灰色墨),彻底杜绝任何暖色颗粒,营造如历史尘埃、香烛轻烟与崇高圣光般的纯净精神场。

7. 配文

7.1 配文内容清单
  • 中文主标题(双列错落竖排):
    • 列 1(右):「万千姓名」(Noto Serif CJK SC,42 pt)
    • 列 2(左):「皆曾拥有今日的体温」(Noto Serif CJK SC,42 pt)
  • 英文对应标题(水平排布):
    • "TEN THOUSAND NAMES ONCE HELD THE WARMTH OF THIS VERY HOUR"(Noto Sans CJK SC Bold,16 pt)
  • 英文副注释(水平微型排布):
    • "BENEATH THE STONE VAULT · TIME SUSPENDS IN QUIET GAZE"(Noto Sans CJK SC,12 pt)
  • 中文微型注释 1(竖排,右侧过渡区):
    • 「岁月的刻痕在石壁上沉寂 · 生者的凝视让往昔回响」(Noto Sans CJK SC,15 pt,位置 X=1850.0, Y=720.0)
  • 中文微型注释 2(竖排,左侧建筑开阔留白区):
    • 「石壁无声 · 呼吸如初」(Noto Serif CJK SC,13 pt,位置 X=555.0, Y=1180.0)
7.2 排版几何位置与非描述性自查
  • 排版位置理由:中文双列主标题与英文横排标题被放置在画面右侧的大面积留白区域中,左侧微型注释 2 嵌在左柱与石碑间的几何中轴线上。文字充当了画面看不见的几何比例尺,平衡了左重右轻的不对称建筑体量。
  • 非描述性自查(严格通过):文案完全聚焦于“历史长河中的生命温度”与“面对石碑时的静默哲思”,没有一句描述画面具象视觉(没有提及“三个人”、“背影”、“橙色衣服”、“大教堂”或“拱门”)。
  • 纯粹性检查:画面上仅保留配文文本本身,无任何时间、地点、作者签名、展览标题栏、机构 Logo 或水印。

8. 不良联想自查与规避

在完成渲染并对全图进行 100% 比例及整体审视后,特别针对可能引发不适或歧义的视觉要素进行了专项审查与代码级预防调整:

  1. 动势场颗粒与射流联想自查:
    • 潜在风险:在人体周围如果出现散落的橙色/红色碎屑、飞溅网点或从身体拖拽出的轨迹,极易被观者第一眼误读为“枪击”、“爆炸碎屑”、“鲜血飞溅”或“伤口喷射”。
    • 调整与规避:
      1. 动势场色彩坚决剥离红橙暖色,唯一采用冷灰石色 #848E98;
      2. 运动方向严格锁定为朝天空的单向垂直升华,严禁发散性爆裂纹理;
      3. 动势场底部严格截断于人物肩颈水平线以上(Y ≤ 1180),人物身躯完全不受任何飞溅点干扰;
      4. 网点采用均匀规整的版画印刷半色调,呈现如教堂圣光透射与静止尘埃的宁静氛围。
  2. 拱券与碑体黑白反差自查:
    • 潜在风险:若中央石碑采用厚重纯黑或实心高对比阴影,容易让人联想到阴森墓穴、监狱铁门或压抑的棺椁。
    • 调整与规避:
      1. 纪念碑不采用黑色,而是采用大面积传统石刻拓片(Stone Rubbing)灰度,内部带有自然的断墨与纤维露白;
      2. 拱券外框采用通透纤细的多重同心线弧,保留大量透气的象牙白底色,使整体建筑空间显得开阔、神圣而非阴暗。
  3. 隔离链条联想自查:
    • 潜在风险:若链条过粗或横贯人物颈部,容易引起“锁链”、“捆绑”等暴力囚禁联想。
    • 调整与规避:链条绘制为极细的 1.8 px 悬链线下垂曲线,穿过三人腰部后方,两端带有优雅的博物馆立桩,明确界定为文明场馆的常规参观防护设施。

9. 逐条自检清单

9.1 第 2 节:7 条硬性限制自检
编号限制条款判定依据与代码落实证据
1只能用代码作画✓所有拱券、人体剪影、文字排印、纸张植物纤维、石刻拓片、网点动势场均由 src/textures.c 与 src/render_poster.py 中的数学公式与噪声算法实时计算生成。
2不能用图像生成模型✓零 AI 模型调用、零文生图/图生图 API、零外部预训练分割与抠图算法。
3生成程序不能读取照片✓src/render_poster.py 与 src/textures.c 中没有打开、采样、读取 reference.jpg 的任何代码;所有坐标与色值均为手写硬编码常量。
4不用外部图形素材✓未引入任何外部 SVG、PNG/JPG 贴图、笔刷或模板库;唯一外部资源为操作系统自带的开源思源字体 Noto Serif/Sans CJK SC。
5不用预装 skill/插件/旧代码✓全套代码从零独立编写,未加载任何外部 poster 相关 skill。
6结果可复现✓底层伪随机数生成器基于 PCG32 算法并锁定固定种子(Seed 42);同一环境多次运行输出的 poster.png 的 SHA256 校验码完全一致。
7一张平面海报✓仅生成一张平整的 poster.png,纸色平铺至四边,无多张、无相框样机、无立体透视背景、不与原照片拼接。
9.2 第 4.2 节:可核对规格表格逐行自检
规格项要求判定依据与量化数据
核心母题一个;辅助形 ≤ 3,具叙事意义✓核心母题:三口之家背影组合(1个);辅助形:哥特尖碑、同心拱券、悬链矮桩(恰好3个),各有明确叙事意义。
几何框架推自结构,含圆弧与轴线;无显式辅助线✓推自主轴 X=960 与起拱线 Y=1120,推导出一组同心等边哥特尖券圆弧;全图未绘制任何辅助线、圆心与十字标记。
主体尺度人物高度 ≤ 短边的 35%✓短边为 2000 px;人物最高为父亲 520 px,占比为 26.0% ≤ 35%。
留白纯纸无墨面积 ≥ 50%✓经全画幅像素采样统计,纯纸基面积为 85.78% ≥ 50%。
色版每色一版,内部具肌理边缘清晰;正片叠底允许微量错位✓分设深色版、石碑拓片灰版、橙红版、柠檬黄版;物理乘法正片叠底,带有 0.5–1.5 px 套印微差。
配色纸色 + 深色 + 主题色 1–2 种;全图 ≤ 4 种墨色✓纸色 #F7F5EE + 4种墨色(#1C232A、#DB502A、#CABD62、#848E98),总墨色严格等于 4 种。
动势场恰好一个,一种运动逻辑;随距离衰减至零✓恰好 1 个动势场;单一垂直升华逻辑;由粗糙网点、垂直裂线与散点组成;向尖顶向上衰减至零。
手绘线仅用于识别细节;微抖、轻重不一、偶断✓仅用于父亲羽绒服衍缝线、青年大耳机轮廓与地面接触线,带有微小位移抖动与断续。
纸张程序生成纤维、斑驳、颗粒;非纯色✓程序生成双八度 Perlin 木浆密度噪声与 1800 根有机弯曲植物纤维,呈现温润纸张肌理。
文字中文标题 + 英文对应 + 1–2 条微型注释;含竖排;纯配文✓双列竖排中文大标题 + 横排英文对应 + 2 条微型竖排注释;全图仅保留配文本身。
不良联想不得让人联想到血迹、暴力、死亡等✓经专项排查,冷灰色单向上升粒子彻底杜绝了血迹、爆炸与暴力意象。

10. 实现摘要

10.1 系统架构与代码分工

项目采用 “底层 C 语言高性能版画与噪声合成引擎 + 上层 Python/ctypes 几何矢量与文本编排” 的混合架构,兼具精确几何表现力与纳秒级像素处理性能。

+-----------------------------------------------------------+
|                   src/render_poster.py                    |
|  - Equilateral Gothic pointed arch geometry calculations  |
|  - Ergonomic cubic Bezier figure silhouette paths         |
|  - Pango + Noto Serif/Sans CJK typography layout          |
|  - Cairo vector-to-alpha mask rasterization               |
+-----------------------------+-----------------------------+
                              | ctypes API
                              v
+-----------------------------------------------------------+
|                      src/textures.c                       |
|  - Deterministic PCG32 PRNG (Seed 42)                     |
|  - 2D Perlin gradient noise & fBM pulp synthesis          |
|  - 1,800 curved cellulose organic fibers generation       |
|  - Stone rubbing & woodcut dry-brush plate modulators     |
|  - Halftone dot & broken vertical striae dynamic field    |
|  - Subtractive physical multiply blending & misregistration|
+-----------------------------------------------------------+
                              |
                              v
                   poster.png (3000 x 2000)
10.2 关键模块实现原理
  1. 纸张生成 (textures.c: generate_paper_texture):
    • 采用两层八度 Perlin 噪声调制基础象牙白基色(#F7F5EE,变化幅度 ± 3 LSB);
    • 在图层中注入 1800 根具有随机曲率、长度(15–45 px)和轻微色素沉着的植物纤维曲线,模拟传统手工宣纸/版画纸的触觉体验。
  2. 色版肌理调制 (textures.c: modulate_plate_texture):
    • 石碑拓片(Stone Rubbing):高频 Perlin 噪声阈值化微孔调制,模拟古代青石拓片的斑驳质感;
    • 木刻干笔(Woodblock Dry-brush):沿横向施加低频拉伸条纹与墨迹干涩飞白断墨,模拟厚重羽绒服的木版凹凸感;
    • 丝网平涂(Silkscreen Ink):高密度极细颗粒点阵,保持色块中心饱和且微观生动。
  3. 动势场渲染 (textures.c: render_dynamic_field):
    • 依据垂直高度 Y 计算指数衰减概率,在尖券内部走廊实时光栅化半色调圆点与断续纵向刻线,向留白平滑消隐。
  4. 叠印与物理套印微差 (textures.c: blend_plate_multiply):
    • 采用减色法物理正片叠底公式:C_out = fracC_base × C_ink255;
    • 每个色版在合成时引入 0.5 sim 1.5 px 的亚像素微量位移,精准还原传统多色套印版画的自然呼吸感。
  5. 所用系统库与字体:
    • 依赖库:libcairo.so.2、libpango-1.0.so.0、libpangocairo-1.0.so.0、libgobject-2.0.so.0、libm、OpenMP;
    • 字体:Noto Serif CJK SC(主标题与古风注释)、Noto Sans CJK SC(英文对照与现代注释)。
10.3 运行与复现命令

在项目根目录下,直接执行:

./run.sh

或单行命令:

gcc -O3 -shared -fPIC -fopenmp src/textures.c -o src/textures.so -lm && python3 src/render_poster.py

耗时约 2.0 秒,即可在根目录下生成完全一致的 poster.png。


11. 已知不足

在客观审视最终交付海报后,自我剖析以下两处在未来迭代中可进一步深化的设计要点:

  1. 母亲右侧织物布包的微观纹理表现:
    • 在原照片中,母亲右臂所挽的布包带有非常细密的波西米亚/几何编织花纹。在当前海报中,为了保证版画大色块平涂与锐利边缘的统一性,将其抽象为了深色几何块剪影。若能增加一版极细的微型木刻几何回纹露白,将更能增强该细节的日常温情与识别辨识度。
  2. 建筑正投影重构与纵深透视的张力平衡:
    • 原照片的大教堂内部拥有仰角透视造成的收缩感,使人感受穹顶的高不可攀。海报中为了构建极度严谨的现代平面网格秩序,将其完全正投影化(Orthographic Projection),虽然显著提升了现代艺术展图录的静谧与几何美感,但也在一定程度上减弱了原建筑空间摄人心魄的纵深压迫感。
10

MiniMax 3.1 Flash

MiniMax 3.1 Flash 生成的海报《没有人回头》
点击海报放大 · ← → 翻看
我的主观评价

全场耗时最长的模型。人物、铁链和拱门以及碑文的空间关系稍显混乱。动势场放在拱门尖顶之外也是不多见的选择。执行任务过程中在 56 分钟时出现了不明原因的中断,人工介入后能继续完成任务。

海报配文
「没有人回头」None of them turned back
故事
有些人留在了墙上,而来看他们的人,一个也没有回头。
↓ 完整文件包 ZIP · 7.3 MB ↓ 海报原图 PNG · 5.6 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/poster.py
模型自述报告REPORT.md

程序:src/poster.py(Python 3 + Pillow + numpy)生成命令:./run.sh 或 python3 src/poster.py 成品:poster.png,3000 × 2000 像素,PNG,无透明通道(横画幅,随原照片方向)随机种子:SEED = 20251027(同一台机器上重复运行,输出 MD5 完全一致,已验证:c7d2efd1aaf61f0fee038f2d6ee38b9c)


1. 读到的照片

事实(我放大局部逐处看过)

  • 场景是一处石造廊院/回廊:哥特式尖券拱(arch)一个接一个向纵深排开,拱肩上有阴刻的叶饰花纹(spandrel relief),拱下是石灰岩墙面。墙面自地面起 densely 刻满人名,每行是"姓名 + 军团缩写"(C·F·A、G·F·A、2nd Lt、R·E、M·C…),拉丁化的军团番号缩写。墙的上部有一块铭文板与一枚十字,另一块铭文写着大意是"自由不是礼物,而是一笔必须偿还的债"。墙与地面之间有一道黑色铁链,用墙上的小托架固定在柱子之间,给出"可以靠近但要止步"的界线。
  • 人:三个。 全部是背面朝镜头,站在墙前。
    • 中间那位:中年男子,橙红/朱砂色的横绗羽绒服,灰白头发、能看见一截眼镜腿与侧脸轮廓,下巴微抬(在往上读墙上的名字),下摆露出一线格纹衬衣,浅蓝牛仔裤,脚下是深色运动鞋。
    • 左边那位:另一名成年人,浅黄(接近柠檬黄)的羽绒服,深色头发低垂、向右偏,像是把头靠在中间那位的肩上;发间别着一枚细发夹;深藏青长裤、黑色运动鞋。
    • 右边那位:明显更矮的一人(孩子/年轻人),黑色羽绒服,肩上有一道浅色反光条,头上裹着一块米白色头巾/帽兜,露出浅褐色头发;黑色长裤、深色运动鞋。
  • 关系与视线: 中间那位抬头向右读墙;左边那位靠着他、头低垂;右边那位挨着他。三个人离墙很近,离镜头(读者)很远,视线全部落在墙上,没有人回身。
  • 能认出身份的细节: 眼镜腿、头发上的发夹、孩子的浅色头巾与反光条、运动鞋、铁链、格纹衬衣下摆。

我的解读(取最平常的那种,不编情节)

这就是三个来看望/查阅名单的普通人,安静地站在一战的阵亡名录前。没有更多信息,我也没有给他们的关系、身世、情绪写出任何具体情节——海报的配文因此刻意停在"沉默与记住"这一层,不作任何认定。

2. 故事

一句话: 有些人留在了墙上,而来看他们的人,一个也没有回头。

3. 取舍

保留理由
三个人背对我们的剪影照片里最不可替代的信息:并排、距离、姿态(抬头 / 低头 / 挨着)
朱红与柠檬黄两件羽绒服 + 孩子的黑照片里唯一鲜艳、有精神气的东西;三色块也正好把三个人区分开
尖拱与"密密的名单"建筑与内容的双重象征;名字是这地方真正的"物"
铁链把"可以靠近但要止步"这条边界画出来,兼作全幅唯一的水平线
眼镜腿、发夹、浅色头巾、运动鞋、反光条让人能认出原物的少数细节
删掉理由
第 2、3 个拱与纵深柱列照片的空间来自透视,海报不靠透视,靠几何框架;多一个拱就多一个视觉焦点
铭文全文、十字、拱肩叶饰、纹章属于"抄写照片";且"通俗传统纹样"与印章是被明确排除的
豹纹围巾是照片里的装饰性花纹,只会变成杂色
人物的脸照片里本来就几乎看不见脸;只保留抬头者的侧脸轮廓与眼镜腿作为识别点
地面的石板、墙上的污渍背景复杂化;改为程序生成的纸面肌理
孩子与墙上的具体位置落差儿童尺度的绝对小会变成叙事,我在海报里保留的是"更矮的一人"这一关系
原碑文的拉丁军团缩写抄写即描述;只保留"密排的横向刻痕"这一形式

4. 几何框架

框架取自照片里最不可替代的结构——尖券拱。为免"抄建筑",我只把它当作位置与边缘的依据,辅助线、圆心、十字、网格一律不画。

  • 尖拱=两段等半径圆弧:跨度 SPAN = 2240 − 1240 = 1000,起拱线 y = 1150,拱高 ARCH_H = 620,拱顶 APEX = (1740, 530)(拱轴 AXIS_X = 1740)。
  • 圆心与半径(由上列数字算出,不写在画面上):u = (ARCH_H² − (SPAN/2)²) / SPAN,R = SPAN/2 + u = 634.4;左半弧的圆心 (1874.4, 1150)、右半弧的圆心 (1605.6, 1150)——正是照片里"用对侧起拱角作圆心画尖拱"的作法。左半弧由左起拱角 (1240,1150) 升至拱顶,右半弧由拱顶落到右起拱角 (2240,1150)。
  • 轴线:x = 1740(尖拱的竖向中轴),同时是墙脚线 y = 1670 上人物脚底所在的地平线。
  • 各元素对齐到哪条关系:
    • 三个人站在墙脚线 y = 1670 上(照片里他们贴着墙根站),总高 688 px。
    • 中间那位的头心 (1384, 1036) 是动势场的核心;他的视线方向决定动势场的走向。
    • 人物整体偏左,与壁龛左缘 x = 1240 相交——黄衣者的背贴近左缘、黑衣孩子的身体越进壁龛里,边界被突破。
    • 竖排中文标题轴线 x = 372,英文标题轴线 x = 578(两者平行,相距 206 = 两列文字的"字距"量)。
    • 微型注释的中文左对齐 x = 1740(拱轴),微型注释的英文右对齐 x = 2240(右起拱角)——两行小字各咬住一条框架线。
    • 铁链从左下向右上升,横贯全幅,与起拱线、墙脚线共同构成三条水平基准。

预想的秩序(远看应当一目了然):左三分之一是竖排标题;中偏左是三个人的色块,其右边是尖拱形的名字墙;名字墙自下而上由密到稀,越过拱顶散进纸里;一条斜向上升的细流从抬头者的头顶穿出拱顶;底部一条微微上斜的链线;右下角两行小字。全部由同一套尖拱/轴线/地平线决定。

5. 配色

只用四种墨:纸色 + 深色 + 主题色一 + 主题色二。其余明度全是同色的淡版(不另算墨色)。

用途色值来自照片哪里为什么选它
纸色#F7F2E8 (247,242,232)受光的石灰岩面 #E8E5D6、#EBEAE2保温暖白,保持明亮不发黄;纸面另加程序生成的纤维与斑驳
深色#262923 (38,41,35)券洞深处的阴影 #22241F;左侧那位与中间那位的头发 #31302D–#4C5052;黑人羽绒服的 #141D1D既是照片里最深的一处,也是建立整套骨架的骨色文字/鞋/字
主题色一(朱红)#C15338 (193,83,56)橙红羽绒服 #C15C47、#C85F48(高光 #DB9D92)全片最鲜活的一处,照片里唯一的高饱和色
主题色二(柠檬黄)#CFC04C (207,192,76)浅黄羽绒服:色相实测在 50°–60°、但饱和度极低(#CBC6A8–#E8E5D6)照片里这黄几乎被纸色吃掉了;海报里重新提纯成可读的柠檬黄,才不至于和纸色糊在一起
淡版(不另计)牛仔裤 22%、黑长裤 62%、童发 38%、壁龛石面约 5%牛仔裤 #5E84A7 的明度、深色长裤的近黑、孩子的浅褐发、壁龛的阴影明度阶梯:纸 → 牛仔裤 → 长裤 → 黑块;接近照片原有的黑/灰/亮关系

配色刻意压低饱和、避免荧光与渐变;纸色与墨色之间保持"印刷"的中等对比。

6. 动势场

  • 转化的运动: 照片里唯一清晰的方向性是中间那位抬起的视线——他抬头向右读墙上的名字;画面里唯一"流动"的东西也就是墙上一行行刻痕向上延伸。
  • 运动逻辑:上升(只有这一种)。具体做法:
    1. 墙面的名字由极小的横向笔画组成,成"词"成行(每行 10–12 px,笔画 5–13 px),密度自下而上衰减:墙脚处密(0.50→1.00),进入拱腹后按 0.55·t^1.7 变稀,到拱顶只剩零星。
    2. 拱腹里的笔画整体向右上方缓慢偏移(每升高 1 px 右移 0.115 px),方向与抬头的视线一致。
    3. 一股更细的笔画从视线的核心 (1386,1020) 沿二次贝塞尔曲线斜向右上升,穿过拱腹,在拱顶之上散成颗粒,最后消失于纸面。
    4. 拱顶之外另有约 500 颗散点,越远越淡。
  • 边界由框架的哪部分决定: 名字墙的行宽被尖拱的两条弧裁切(arch_bounds(y) 直接由圆心与半径算出),所以密集区的两侧是锐利的竖直边;密度衰减到零的那条线由起拱线和拱轴共同定位——核心正对墙脚、正对拱轴下方。
  • 近核心密集、向外稀疏: 最密处就在三个人头顶与墙面交界处(人的正上方最多),向上、向外逐级破碎、归零。

7. 配文

位置内容
左侧竖排(字号 112,列距 154,轴线 x=372)「没有人回头」
紧邻其左、旋转 90° 由下往上(33 px,宽字距 11,轴线 x=578)"NONE OF THEM TURNED BACK"
拱轴下方,中文小注(左对齐 x=1740,30 px,字距 9)「风停在名字之间」
同一处右下,英文小注(右对齐 x=2240,21 px,字距 4)"THE WIND RESTS BETWEEN THE NAMES"

为什么放在那里: 标题竖排在左侧空白里,与壁龛的竖向轴线平行;英文标题旋转 90° 贴住中文列,形成一组"轴线上的双行",不与主体争夺注意力。两行微型注释放大贴近地平线与拱轴/右起拱角,让它们参与几何秩序而不是贴上去。

自查"是否在描述画面": 草稿阶段写过「站在名字中间」「抬头看的人」「四个人」这一类句子,读起来就是画面说明,全部弃用。现在这句「没有人回头」在语法上是一个关于"某些人"的判断,主语隐含为墙上的人(那些名字),是对主题的引申而不是对可见内容的复述;英文 "NONE OF THEM TURNED BACK" 同样把 "them" 留在歧义里(既可指死者,也可指此刻站着的人)。「风停在名字之间」是比喻(世界里安静下来的那一刻),不是"我们看见了名字"。

8. 不良联想自查

单独看整图时,我设想读者第一眼可能产生的联想,以及我的处理:

  1. "红色+向后拖的颗粒=血迹/爆开" — 第一稿确实有这个风险:朱红块正上方就是一股向上飘的黑颗粒,很容易读成烟、血或爆裂。处理:把动势场的所有笔画改成水平的短横(与墙上刻名字同一种语言),让它与"文字"而不是"物质"关联;把动势的方向由"正上"改为"右上",使其从人物身体向右上方离开,不贴着后背拖尾;颗粒统一用与刻字相同的深墨色(不用任何红橙),红色只存在于羽绒服这一块版内;并让最密处落在墙的底缘而不是紧贴人身后背。
  2. "孩子的黑块+头顶白块=伤口/敷料" — 白色头巾做成包住头顶一圈的月牙,而不是脸上的一块;黑块是完整的羽绒服轮廓,有肩、有反光条、有裤脚的分开,不会读成创口。
  3. "尖拱=墓碑/灵位" — 原照片本来就是纪念建筑的券洞,这层联想是内容本身带来的,不是"不适";为避免过强的宗教感,我把拱做成凹进墙面的浅色壁龛(而不是一块立着的深色碑),并让墙上刻满名字,主导读法是"名录"而不是"牌位"。十字、叶饰、纹章一概不取。
  4. "三个人抱在一起=遗体/哀悼的葬礼布置" — 三个色块边界清晰、姿态是"并排站着读墙",不是躺卧或包围;头是圆钝的头形而非面部,不构成面部哀伤的表情。

结论:成图未出现血迹、伤口、暴力、死亡或不适的直接联想;最接近的风险(红色旁的上升颗粒)已通过"改颜色、改方向、改语言"三重处理消除。

9. 逐条自检

第 2 节的 7 条硬性限制
条依据
1 只能用代码作画✓src/poster.py 里所有图形都是坐标/控制点/圆弧/贝塞尔/多边形;肌理来自 fbm/streak_mask/dropout_blobs 的程序噪声。附带的观察脚本只用于读照片,不参与生成。
2 不用图像生成模型/预训练视觉模型✓只用了 Pillow 与 numpy。无文生图、无分割、无抠图、无边缘检测、无风格迁移,无任何网络调用。
3 生成程序不读取照片✓poster.py 全文没有 reference.jpg 的路径,也没有任何 open()/Image.open() 指向照片;所有形状都是手写控制点,所有颜色都是手写色值。
4 不用外部图形素材✓无 SVG 库、无图标、无笔刷贴图、无纹理图片、无模板。唯一外部资源是本机字体:NotoSerifCJK-Regular.ttc(index 2 = SC)与 DejaVuSerif.ttf。
5 不用预装 skill/旧项目代码✓全部从本目录的 src/poster.py 写起;没有调用任何海报类 skill。
6 结果可复现✓SEED=20251027,所有随机数走 random.Random(SEED) 与 numpy.default_rng(SEED);连续两次运行输出 MD5 均为 c7d2efd1aaf61f0fee038f2d6ee38b9c。
7 一张平面海报✓单一平面,纸色铺到四边,无样机/相框/投影/透视/外框/拼图。仅 poster.png 一张。
第 4.2 节的可核对规格
项实测/依据
核心母题✓一个:三个人背对的剪影群。辅助形三个且各有叙事:①尖拱壁龛(纪念建筑与名录的容器)②墙上的名字(内容本身,同时承担动势)③锁链(可止步的界线)。
几何框架✓尖拱=两段 R=634.4 的圆弧,圆心 (1874.4,1150) 与 (1605.6,1150),轴线 x=1740;人物站墙脚线 y=1670;标题走两条平行竖轴;小注咬拱轴与右起拱角。辅助线、圆心、十字、网格、标记点一概未画——画面上只有被填充的形状与文字。
主体尺度✓人物总高 688 px = 短边 2000 的 34.4% ≤ 35%。
留白✓与"只有纸"的基准图逐像素比对,有墨面积约 17.5%,纯纸约 82.5% ≥ 50%。
色版✓每种颜色一版;版内含斑驳、干笔纹、露白斑(dropout_blobs,露白处直接回到纸面)以及版边 2 px 的满墨硬边;各版按正片叠底相乘叠印,套印错位:壁龛 (+2,−1)、黄衣 (−2,+1)、红衣 (+2,+1)、黑衣 (+1,−1)、深色与鞋 (0,0)–(+1,0)、童发 (+1,0),均在 1–4 px 内。
配色✓纸色 1 + 深色 1 + 主题色 2(朱红、柠檬黄)= 四种墨;牛仔裤/长裤/童发/壁龛都是深色的同色淡版。
动势场✓恰好一个,运动逻辑为"上升";由断续横向细笔画 + 散点 + 颗粒组成,密度随离核心(抬头者的头)距离衰减到零,右侧边界由尖拱弧线裁切。
手绘线✓只用于识别细节:铁链(每环一条抖动、断续、粗细不一的笔触)、眼镜腿、发夹、孩子的反光条、灰发。均为短促、轻重不一、略有停顿的笔触。
纸张✓纸面 = 程序生成:低频斑驳 + 2.2 万根随机纤维 + 高斯噪声颗粒,非纯色。
文字✓中文标题「没有人回头」竖排(列距 154,字号 112);英文标题旋转 90°;微型注释两行(中/英各一)。画面上没有时间、地点、标题栏、风格名、署名或水印。
不良联想✓见第 8 节。

10. 实现摘要

  • 库与环境:Python 3、Pillow 13.0.0、numpy 2.5.4;本机字体 Noto Serif CJK SC(/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc,index=2)与 DejaVu Serif。无需另装依赖。
  • 纸(paper_array):底色 #F7F2E8 → 5 倍频 value noise 造成的斑驳(±4%)→ 22 000 根随机纤维(±5 级)→ 高斯颗粒(σ=2.2)。
  • 色版(ink_block + overprint):每版先算一张几何遮罩;纹理分四项——斑驳(fbm)、干笔纹(随机长条旋转成条纹场)、露白斑(稀疏圆点连通后阈值化)、细颗粒;肌理作用在墨量(dens)而不是覆盖度上,所以版内是实心的、斑驳只让墨色深浅变化;版边 2 px 强制满墨(MinFilter 求内区与原遮罩之差)保住锐利轮廓。叠印用正片叠底公式 out = out·(1−a) + out·ink·dens·a,两层重叠处自然变深。
  • 露白:露白斑先 knockout 回到纸面再上墨,所以斑里露出的是纸,而不是下层的字;同理,人群整体(连同孩子的头发)先在墙面上"挖"出自己的一块纸底,再叠各自的墨版,墙上的字不会从衣服和头发里透出来。
  • 人群:14 个部件(外套/裤子/鞋/头/颈)各用 Catmull-Rom 平滑后的多边形或旋转椭圆,控制点全部来自对照片的量测,按"裤子 → 鞋 → 三件外套 → 头 → 颈"的顺序叠印;先对整个人群做 4 px 的纸色间隙,使人群从名字墙里"切"出来;三个人相互遮挡的部分(黄衣者的头压在红衣的帽兜上、黑衣孩子越进壁龛)按照片的前后关系决定叠放次序。
  • 名字墙与动势(build_names):纯程序。墙面的"词"由 2–6 笔组成、笔间 1.6–3.2 px、词间 5–13 px;行距 10.5–12.5 px;每行按 dens(y) 决定每一笔是否落纸;拱腹里的行整体向右上方偏移;升起的细流沿二次贝塞尔曲线分布,强度 sin(πt)^0.85·(1−0.68t);拱顶外 520 颗散点。全部笔画最后按墨量从低到高叠画(后画覆盖先画=取最大值)。
  • 铁链(build_chain):6 个墙托架之间各一段悬链(正弦近似),每 29 px 一环,环由 11 点抖动折线画成,约 10% 概率缺环,粗细 2–3 px,深浅随机。
  • 文字:中文用 Noto Serif CJK SC 逐字竖排(anchor="ma"),英文横向排好再整体旋转 90°;所有文字也走 ink_block,因此带同样的印刷肌理,边缘仍是锐利的。
  • 字体与命令:./run.sh(等价 python3 src/poster.py),约 25 秒,输出 poster.png。

11. 已知不足

  1. 人物仍偏"块"。 三个人在缩到 1/4 大小时能读成"三个背对的人",但细看有笨拙处:左侧那位低垂的头仍略显独立的椭圆;红衣的肩线偏平,缺一条手臂的体积;孩子的黑块偏"袋形",肩与腰的转折不够。分辨率再小一点时,这三个头的轮廓容易互相读成一串圆。
  2. 灰发与眼镜太轻。 眼镜腿只有三四笔、灰发只有两百来根短划,在原尺寸放大看能辨,放到整幅看几乎消失;头发与孩子那双浅褐发之间也没有做到照片里那种清晰的明度差。
  3. "名单"只是节奏,不是文字。 刻名被抽象成横短划,行距与疏密接近照片,但排不出拉丁军团缩写那种参差的"词"宽变化;也因此整片更像一块网纹,而不是一面写满名字的墙。
  4. 壁龛只有一个均匀的浅色。 真实墙面有柱子投下的竖向明暗与污渍,我为了"平面/克制"把它压成单一色调,代价是券洞的体积感偏弱,形状更像一片剪影。
  5. 铁链的环一律平排。 真实链条的环是互相垂直交替的,我画成同一平面的椭圆串,远看是一条点线,质感略卡通。
  6. 中英字体并非同源。 中文用 Noto Serif CJK SC,英文用 DejaVu Serif,两者气质接近但字面比例不同,英文列的宽字距是我手动加的;若要更整,可改用同一套 CJK 字体里的拉丁部分。
  7. 偏肃穆。 全图冷暖克制、几乎无强色块,若目标是更鲜活的展览感,需要把朱红再推一档、把纸的亮度再提一档——我在"克制优先"的方向上做了选择。
  8. 动势峰值的精确位置。 密度最高处落在墙面底缘(三个人头顶一带),而不是正压在抬头者的头顶上;这是为了让"一眼看见名字墙",但严格按原文字面(靠近核心最密)可以再往核心挪一点。
11

Kimi 3.1 Pro

Kimi 3.1 Pro 生成的海报《把静默读成光》
点击海报放大 · ← → 翻看
我的主观评价

动势场的方向和趋势都偏弱。看得出来它想画出人物的眼镜和耳机,但结果却不甚理想。气质更接近插画而非海报。即使连接的是官方的 API,也只能达到 9 tok/s 的速度,非同寻常的慢。

海报配文
「把静默读成光」Reading silence into light
故事
三个人并肩,把各自的静默交给同一面记忆之墙。
↓ 完整文件包 ZIP · 4.8 MB ↓ 海报原图 PNG · 3.1 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/generate_poster.py
模型自述报告REPORT.md

1. 读到的照片

照片里有三个人,都背向镜头,站在石砌纪念空间的墙前。中间是较高的成年男性,穿橙红色羽绒服和蓝色牛仔裤,头发花白,头部略向右上转,耳侧有一小段眼镜腿;双手收在衣袋附近。左边的人留深色中长发,穿浅黄白色连帽外套和深色长裤,身体靠近中间的人。右边的人明显较矮,穿深色羽绒服,头发较长,戴白色耳机,面朝墙面。三人并肩而立,姿态安静,没有夸张动作。

场景是有连续尖拱、石柱和浅刻文字的纪念性石墙;墙上有名字和纪念文字,前方有低矮锁链。照片中最能识别三人的细节是橙红色羽绒服、浅色外套、较矮同行者的耳机,以及中间人物的眼镜和牛仔裤。

我的平常解读是:三人彼此认识,是一起观看纪念墙的同行者;他们可能是家人,但照片本身不足以确认具体身份和亲属关系,所以不进一步编写故事。视线共同落在墙面,中间人物略向右侧转头。

2. 故事

三个人并肩,把各自的静默交给同一面记忆之墙。

3. 取舍

  • 保留:三人靠近而身高错落的组合、中间人物的橙红衣与侧转头部、较矮者的耳机、一个尖拱,以及“共同向上观看”的关系。这些足以让看过照片的人重新辨认场景。
  • 删掉:其余尖拱和石柱、砖石分缝、浮雕、十字架、成片的墙面文字、锁链、灯具和地面铺装。它们会制造第二个视觉中心,或把海报带回建筑写生。
  • 转换:不复制墙上的名字,把“名字—记忆”的关系留在微型注释里;不画写实视线,把共同观看转为一道向上衰减的微粒场。
  • 尺度:人物缩到画面短边约 32%,让留白成为主要面积,而不是把三人放大成肖像。

4. 几何框架

全部坐标以 3000 × 2000 的成品为基准,辅助矩阵只参与计算,不画出来。

  • 不可见母圆的圆心为 C = (1480, 1110),半径 R = 520。人物总轴线和尖拱共用竖轴 x = 1480。
  • 尖拱的左右落点为 C.x ± R,即 x = 960 和 2000;拱肩在 C.y = 1110;落脚基线为 C.y + 0.80R = 1526;拱顶为 C.y - 1.21R = 480.8。内拱把半径缩小 58,保持共轴和比例递进。尖拱曲线是该圆弧结构的贝塞尔近似。
  • 三人围绕 x = 1480 排列,中间人物最高,左右两人分别靠近内拱的两侧;鞋底落在基线附近。人物、拱门和动势场形成唯一的视觉中心。
  • 中文标题的竖轴为 C.x + 2R = 2520,英文与之平行,位于 x = 2583。两组微注释的左端分别落在 C.x - R 和 C.x + R,中文基线从 BASE + 104 开始,英文再向下 33。
  • 动势场沿 x = 1480 上升,下端起于人物头部附近的 y = 1000,上端消失在 y = 265;横向扩散和断裂程度只随这段竖轴上的距离变化。

5. 配色

  • 纸色 #F4F5EF(244, 245, 239):对应石墙阴天光线偏冷的感受,采用明亮的冷象牙白,不做泛黄旧纸。
  • 深色 #233338(35, 51, 56):来自照片的石缝、头发、深色衣服和鞋影,用蓝黑而非纯黑建立骨架。
  • 橙红 #D35B40(211, 91, 64):来自中间人物的羽绒服,是画面唯一暖色和最强识别色,只用于衣身。
  • 雾蓝 #7097A3(112, 151, 163):来自牛仔裤和石墙的冷光;同时以淡版用于左侧外套、尖拱和动势场,不增加新的墨色。

纸色加三种墨色,共四种;淡版仍使用相同墨色。所有色版按正片叠底混合。

6. 动势场

转化的是三人朝向纪念墙上的共同观看,以及拱顶向上的空间引导。只采用向上流动这一种逻辑:断续细线、近似网点的圆点和散粒都从人物头部上方起步,向上逐渐稀疏、断裂,最后归零;没有同时使用辐射、涟漪或坠落逻辑。

场域的竖向范围由几何轴上的 y = 1000 到 y = 265 决定,横向范围由距起点的归一化距离从约 65 扩展到 275,再因粒子淘汰而消失。它留在尖拱内部,不使用橙色,也不从身体侧面或后方拖出,避免被读成血迹或其他身体痕迹。

7. 配文

  • 中文标题:“把静默读成光”;英文:“READING SILENCE INTO LIGHT”。中文在 x = 2520 的竖轴上逐字竖排,英文沿平行轴旋转 90°。它们与拱门共用圆和比例矩阵,却远离人物,避免压住主体。
  • 微注释一:“并肩,时间便有了温度” / “SIDE BY SIDE, TIME WARMS”。
  • 微注释二:“名字之外,记忆仍在生长” / “BEYOND NAMES, MEMORY GROWS”。

两组微注释分别放在 x = 960、2000 的派生落点上,位于人物下方的共同基线之外。标题写静默与光的转换,注释写同行和记忆,都不是“三人站在拱门下”这类画面说明。

8. 不良联想自查

单独观看整图时,我设想读者第一眼会读到“三个人在巨大而安静的空间里停留”,随后注意到橙红衣、耳机和向上的颗粒。可能的误读有三类:暖色颗粒贴着身体会像血迹,密集墙体文字和十字架会把记忆主题推向具体死亡符号,粗黑尖拱可能显得沉重压迫。

因此,暖色只保留在中央衣身;动势场改为冷雾蓝并只出现在头部上方;删除十字架、名字摹写、锁链和浮雕;尖拱用很淡的蓝色版,不画厚重阴影。最终没有伤口、血迹、暴力、死亡符号或令人不适的身体形变。

9. 逐条自检

第 2 节限制
  1. ✓ 只用代码作画:所有轮廓、贝塞尔曲线、颗粒、纤维和文字均由 src/generate_poster.py 生成。
  2. ✓ 不用图像生成模型:未调用任何生成、编辑、分割、边缘检测或风格迁移模型、API、网络服务。
  3. ✓ 生成程序不读取照片:源码没有图像输入步骤,唯一输出为 poster.png;观察照片所得内容只以手写坐标和色值进入源码。
  4. ✓ 不用外部图形素材:无剪贴画、图标、笔刷、纹理贴图或模板;唯一外部资源是本机字体。
  5. ✓ 不用预装 skill、插件或旧项目代码:未调用海报类 skill,程序在本目录从头编写,只使用通用 Pillow 和 NumPy。
  6. ✓ 结果可复现:Python 与 NumPy 随机源都使用固定种子 417203 及其派生值;重复运行比较文件哈希一致。
  7. ✓ 一张平面海报:纸色铺到四边,无外框、样机、照片拼贴、透明通道或多版本输出。
第 4.2 节规格
  • ✓ 核心母题:唯一核心是三人群像;唯一辅助形是淡色尖拱,用来交代纪念空间与共同观看的方向。
  • ✓ 几何框架:有圆心 C、半径 R、共轴尖拱和竖轴;所有主要元素按这些关系定位,未画辅助线、圆心、网格或标记点。
  • ✓ 主体尺度:最高人物约从 y = 856 到 1504,高度约 648 像素,为短边 2000 的 32.4%,小于 35%。
  • ✓ 留白:人物、细拱、微粒和文字只占小面积,逐区估算无墨迹纸面超过 80%,明显高于 50%。
  • ✓ 色版:每色独立生成 alpha 色版,内部有云状不匀、白点、干笔缺损,外轮廓仍清晰;套印偏移为 1–2 像素,正片叠底合成。
  • ✓ 配色:冷象牙纸、蓝黑、橙红、雾蓝;淡版不新增颜色,没有荧光色和常规渐变。
  • ✓ 动势场:只有向上流动一种,含断线、网点和散点,密度随离核心距离衰减至零。
  • ✓ 手绘线:只用于羽绒服绗缝、帽领折线、眼镜、耳机和鞋底;由短促、轻重不一且随机断开的笔触组成。
  • ✓ 纸张:细粒、低频斑驳和 1850 根短纤维全部由程序生成,不是纯色或贴图。
  • ✓ 文字:一句中文标题及英文、两条中英微注释;标题竖排且英文旋转;没有日期、地点、署名、水印或风格标签。
  • ✓ 不良联想:已单独检查整图和人物局部;冷色上行场与暖色衣身分离,不含血迹、伤口、暴力或死亡符号。

10. 实现摘要

  • 纸张:NumPy 固定种子生成细粒与低频斑驳,Pillow 绘制随机短纤维。
  • 色版肌理:高分辨率二值轮廓经 Lanczos 缩小得到锐利抗锯齿边缘;内部叠合细粒、低频云斑、露白点和干笔缺损,再按正片叠底混合。各色版带 1–2 像素错位。
  • 动势场:固定种子的断线长度、竖向淘汰概率、点径与横向散布均由距核心的归一化距离控制。
  • 手绘线:把识别细节切成短段,加入小幅坐标扰动、随机断笔、线宽和墨色变化,不描完整外轮廓。
  • 文字:Pillow 排版;中文使用 Noto Serif CJK Regular / Noto Sans CJK Regular,英文使用 DejaVu Sans。字距和旋转均由代码控制。
  • 库与环境:Python 3、Pillow 13.0.0、NumPy 2.5.4;不需要网络或额外安装。
  • 生成命令:在本目录执行 ./run.sh,或执行 python3 src/generate_poster.py。

11. 已知不足

人物被压缩为色版剪影,发束、手指和面部年龄特征不如照片具体;三人之间的亲密程度主要靠间距表达。尖拱省略了原建筑的多层线脚,因此更偏向空间符号而非建筑考据。动势场完全依靠疏密和断续表达,没有箭头,静态观看时“向上”的方向感较含蓄。纸张与断墨是程序生成的均匀统计肌理,仍不具备真实手工拓印中每次压印的局部偶然性。

12

Qwen 3.8 Flash

Qwen 3.8 Flash 生成的海报《名字在石头上呼吸》
点击海报放大 · ← → 翻看
我的主观评价

动势场的起点从每人头上分别开始,别出心裁,但略显诡异。

海报配文
「名字在石头上呼吸」Names breathe in the stone
故事
三个活着的人靠在一起,抬起头,把一小片安静递给一整面名字。
↓ 完整文件包 ZIP · 7.1 MB ↓ 海报原图 PNG · 5.5 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/poster.py · tools/crop.py · tools/observe.py
模型自述报告REPORT.md

成品:poster.png(3000 × 2000,2:3 横版,RGB 无透明通道)生成:./run.sh(即 python3 src/poster.py),固定种子 20261026,重复运行 md5 一致。


1. 读到的照片

事实。 照片拍的是一处哥特式回廊战争纪念馆的内墙:尖拱、束柱、石灰岩墙面,墙上密密麻麻刻着一排排人名,左上方拱心处有一块题记板,带一个十字架,文字含 "TO THE GLORIOUS MEMORY OF MEN … OF THE UNIVERSITY WHO FELL IN THE GREAT WAR 1914–1918"——一所大学纪念在一战中阵亡成员的铭墙。墙前有一道铁链护栏,系在矮柱上,横贯画面。

画面左下有三个人,背对镜头,紧挨着站成一排,一起抬头看墙上的名字:

  • 左边:浅柠檬黄色羽绒背心,深色长裤,短发花白,头明显向右倾,靠向中间的人;一只黑白花纹(豹纹针织)的袖子横搭在中间人的腰背上——是楼着对方的手臂。
  • 中间:最高,锈橙色横纹羽绒服,兜帽堆在颈后,浅蓝牛仔裤,灰色运动鞋,头发灰白,右侧能看到眼镜腿;头向上偏右仰起。
  • 右边:最矮,藏黑色羽绒服,背上有细白色滚线条,黑发,头上有一圈白色发带(或耳罩带),身体向左倾,也贴着中间的人。

解读(取最平常的一种)。 三位亲友(看不出确切身份,像是一家人或多年好友)一起参观这面纪念墙。他们靠得很近、互相楼着,头一起仰向刻满名字的石墙——在看,也许在找某一个名字。场景安静,天气阴凉(地面微湿、衣着厚重)。

2. 故事

一句话:三个活着的人靠在一起,抬起头,把一小片安静递给一整面名字。

3. 取舍

保留(1 个核心母题 + 3 个辅助形):

元素为什么留
三个并肩仰头的人(核心母题)全部叙事都在"并肩 + 仰头"这两个姿态里
刻名墙 → 一排排浅灰短划视线落点;把"名字"符号化为密度,不抄任何真实字母
尖拱 → 一道浅灰弧带主体结构本身就是几何(见第 4 节),也是"回廊/纪念堂"的辨识度
铁链护栏 → 一条手绘悬链线照片里真实存在、位置醒目的识别细节;也是"活人与名字之间隔着一道链"的叙事形

删掉: 第二、第三孔拱和束柱(只留一孔,避免复刻建筑);地面铺装与湿痕;题记板和十字架(宗教与"悼亡"符号容易把画面压成讣告,也属风格说明禁止的通俗纹样);背包、鞋标、衣料质感;左人豹纹袖(见第 8 节:画出来像绷带/吊带,误读风险大于叙事收益,舍去,拥抱感改由身形重叠传达)。

4. 几何框架

框架直接从哥特尖拱本身推出——等边尖拱就是两个圆:

  • 圆 A:圆心 (720, 1520),圆 B:圆心 (2280, 1520),半径 R = 1560 = 两圆心距离(等边拱)。
  • 拱顶 = 两圆交点 (1500, 169);纵轴 x = 1500 过拱顶。
  • 起拱线 y = 1520;地线 y = 1715 = 起拱线 + R/8(比例递进)。
  • 弧带:两圆弧各取 60° 段(180°→240°、300°→360°),带宽 40,下端在起拱线处平切。

各元素对齐关系:

  • 刻名墙:整块被裁切在"两圆各缩 74px"的尖拱透镜内(边缘裁切、相切关系),行距 36px 自 y=430 起,左缘自 x=900 起淡出——名字向人物一侧延续出去。
  • 人物:脚站在 R/8 递进出的地线上;左人背心左缘与左弧带的镜侧缘保持约 20–35px 的窄缝、与其平行(拱从人旁落下,不穿头);组心偏画面左下,全高 565px = 短边 28.3%。
  • 动势场:起自三颗头顶,沿 +0.22 斜率向纵轴方向上升,被同一透镜(缩 80px)裁切,最高升到 y≈380 后已稀薄近无。
  • 铁链:两端点都落在起拱线上,右端点恰是圆心 B (2280, 1520);最低点 (1140, 1655) 在两端点中点的垂线上。
  • 标题:首字顶缘 y = 430,与刻名墙第一行同一水平线;竖排列 x = 2352,与右弧带外缘大致平行嵌套。
  • 不画任何辅助线、圆心、十字、网格、标记点。

5. 配色

角色色值来源理由
纸色#EFEDE6受光石墙 #B2AFB6 / 拱面 #B4B1B7 提亮去灰照片色温偏冷中性,取明亮冷米白;不发黄不做旧
深色(骨架)#232A31右人藏黑羽绒服 #191F24 / 阴影石材一种深色承担剪影、头发、鞋、文字、最深的版
主题色 1:锈橙#B95A3E中间人羽绒服实测 #BB685A / #C56E5D 提纯全照最鲜活的一块颜色,给核心母题定视觉中心
主题色 2:柠檬黄#D9D093左人背心实测 #E3E0D4 / #C9C199与锈橙同属照片的"人味",克制到只给一件衣服

次要区域全用深色淡版(同一墨色降低 alpha):弧带 0.30、刻名墙 ≈0.23、动势场 ≈0.36、牛仔裤 0.58。全图墨色共 3 种 + 纸,不超过 4 种。

6. 动势场

转化的是照片里的视线关系:三束目光从低处汇向高处的名字。选一种运动逻辑——上升(带极小向轴漂移,暗示"风",与配文呼应)。由断续细线和小点组成,起自三颗头顶上方,密度按 exp(−2.6t) 随离头距离衰减到零,最高升到 y≈420,被尖拱透镜裁切、在墙前自然消散。墨色用深色的最淡版(灰),刻意不用锈橙——避免任何从身体拖出的暖色颗粒被读成血迹。

7. 配文

  • 标题:名字在石头上呼吸 / NAMES BREATHE IN THE STONE 竖排中文置于右侧留白,与右弧带外缘平行嵌套,首字与刻名墙第一行等高;英文旋转 90° 顺读向下,紧贴中文右侧成第二列。为什么在这里:右半幅是视线与留白的去处,竖排文字把这块大留白"称住"而不侵入母题;文字列与弧带平行,参与几何秩序。
  • 注释:风替我们记得 / the wind remembers for us 微型双语,横排贴左下角、地线之下的留白里。为什么在这里:与右上标题成对角呼应,压住左下重心,字极小不喧宾夺主。
  • 自查是否描述画面:"名字在石头上呼吸"——画面里没有任何具体名字、没有呼吸的可视化,这句给石头赋生命,是隐喻不是说明;"风替我们记得"——画面无风无"我们",写的是情绪。两句都不含"三个人""墙""纪念馆"等可当图说的词。✓

8. 不良联想自查

单独看完整图,设想读者第一眼的联想,逐条排查:

  • 上升的灰点会不会是烟/魂? 用的是最淡的灰版、起于头顶上方而非身体,密度低、很快消散;读作"目光/注意力的方向"。为稳妥刻意不用暖色(初稿曾考虑锈色粒子拖尾,因"血迹"风险放弃)。
  • 左人搭在中间人背上的手臂:先后用深色淡版和柠檬色画过两次,叠印结果都像绷带/吊带横在背上(正是第 6 节警告的"贴着身体的形被当成实物"),最终舍去这条手臂,拥抱感由三颗头互相倾斜、身体轮廓重叠传达。
  • 锈橙只出现在闭合的羽绒服形内,边缘锐利,无颗粒外溢;无红色、无飞溅形。
  • 刻名墙短划会不会读成"封条/清单/病历"?取极淡灰、参差行、边缘溶解,读作石面刻痕。
  • 删掉了十字架与题记,避免讣告感与宗教定调;整图安静、明亮,落点是"陪伴与记得",不是死亡本身。

9. 逐条自检

第 2 节 7 条硬限制:

  1. ✓ 只用代码作画:全部图形为手写坐标/曲线/公式(src/poster.py 内常量),肌理全部由固定种子的噪声与随机数生成;仅用 Python + Pillow + numpy 两个通用库。
  2. ✓ 未调用任何图像生成/编辑模型或网络服务,未用任何预训练视觉模型。
  3. ✓ 生成程序不读照片:src/poster.py 无任何打开 reference.jpg 的代码(grep reference src/poster.py 只有注释);观察用的取色/裁图脚本单独放在 tools/,不属于生成管线,进入程序的只有手写的数字。
  4. ✓ 无外部图形素材;唯一外部资源是系统已装的 Noto CJK 字体。
  5. ✓ 未使用任何预装 skill/插件/旧项目代码(环境中确有"photo-poster"类 skill,按要求明确未调用),一切从空目录手写。
  6. ✓ 可复现:SEED = 20261026,所有随机源独立定种;连续两次运行 poster.png md5 相同(2dccebee…)。
  7. ✓ 一张平面海报:纸色铺到四边,无样机、无外框、无拼图、单张。

4.2 规格表逐行:

项✓/✗依据
核心母题 1 个;辅助 ≤3✓人物组;辅助 = 刻名墙、弧带、铁链,各具叙事意义(第 3 节)
几何框架 ≥1 圆/弧 + 1 轴线,不画辅助线✓两圆 + 拱顶纵轴 x=1500;画面无网格/圆心/标记(第 4 节)
人物高 ≤ 短边 35%✓565 / 2000 = 28.3%
留白 ≥ 50%✓程序化量测:与纸色差 >18 的像素占 20.4%,留白 79.6%
色版:断墨/磨损/露白/干笔纹,边缘锐利,正片叠底,1–4px 错位✓textureize():噪声调 alpha + 干笔横纹 + 磨损孔;掩膜 2x 采样保证锐边;overprint() 用乘法混色;各版错位 dx,dy ∈ [−2, 2](版间相对 ≤4px)
配色:纸 + 深 + 主题 1–2,全图 ≤4 墨✓3 墨 + 纸(第 5 节),淡版同墨
动势场恰好一个、一种逻辑、密度衰减到零✓上升视线场,exp 衰减,透镜内裁切(第 6 节)
手绘线只用于识别细节✓铁链环、眼镜腿、羽绒服压线、发带/滚条露白,短促抖动、有断开
纸张程序生成纤维/斑驳/颗粒✓大尺度斑驳 + 细颗粒 + 2600 根纤维短线(代码第 3 节)
文字:中文标题 + 英文 + 1–2 条微型注释;≥1 处竖排/非水平;只有配文✓竖排中文标题 + 旋转 90° 英文 + 一条双语微注;无时间地点署名
不良联想✓第 8 节逐条排查,两处高风险设计(暖色拖尾、绷带手臂)已实际改掉

10. 实现摘要

  • 库/环境:Python 3.12,Pillow 13,numpy 2.5;字体 Noto Serif CJK SC Bold(标题、中文注)、Noto Sans CJK Regular(英文),系统已装,未新增依赖。
  • 纸:底色 + 两级 value noise(随机网格 → bicubic 放大:斑驳 cell 140、细斑 cell 9)+ 6M 字节种子噪声颗粒 + 2600 段随机方向纤维短线(一半亮一半暗,低 alpha)。
  • 色版:每版一张 2x 超采样 L 掩膜(多边形/旋转椭圆/Catmull-Rom 平滑/粗弧)→ Lanczos 缩回 1x 得锐利抗锯齿边缘 → textureize() 用两级噪声乘 alpha(断墨不匀)、横向往干笔纹(低幅切断墨线)、随机小圆孔(磨损露白)→ overprint() 按 out = base·(1−a) + base·(ink/255)·a 正片叠底,各版带 1–2px 套印错位。白衬衫摆、滚条、发带、绗缝线是在掩膜里以 fill=0 刻出的"露白"。
  • 刻名墙 / 动势场 / 铁链:逐元素带独立 alpha 画进 1x 图层;铁链沿悬链线取点,每环画成抖动的小椭圆描边,随机缺环、随机粗细——手绘断续感。
  • 文字:PIL 直接绘制;英文先横排逐字加字距,再整体旋转 −90° 贴入;文字层同样以正片叠底合成并统一 0.94 不透明度做"印在纸上"感。
  • 命令:./run.sh 或 python3 src/poster.py,输出 poster.png。
  • tools/observe.py、tools/crop.py 是观察期取色/裁图助手,只读照片、不被生成程序引用;work/ 临时裁图已清理。

11. 已知不足

  1. 人物是高度简化的剪影,中间人头部与兜帽的衔接仍略"头盔感";照片里"搭手臂"这一最亲昵的动作被舍去后,全靠身形倾靠传达,损失了一点温度。
  2. 刻名墙短划的疏密变化还不够多,放大看局部仍有轻微"表格感"(已用参差行、随机行长、左缘溶解缓解)。
  3. 铁链环的间距与大小抖动偏保守,比真正的手绘记录规整。
  4. 弧带的拓印肌理偏均匀,"古籍拓片"的粗犷度可以再狠一点(当前在锐边约束下取了折中)。
  5. 竖排英文逐字旋转后字距在部分缩放下略不匀。
  6. 纸纹在屏幕尺寸下几乎不可见,需放大到 100% 才读得出纤维与颗粒——是"安静"与"可感"之间的一次偏向安静。
13

Grok 4.7

Grok 4.7 生成的海报《同一行》
点击海报放大 · ← → 翻看
我的主观评价

非常对称的人物造型加上不成比例的细长腿,第一眼看上去人要站不稳了。拱门的拓印感太粗糙。

海报配文
「同一行」The same line
故事
三个人并排停住,把同一道视线抬向高处。
↓ 完整文件包 ZIP · 5.4 MB ↓ 海报原图 PNG · 3.7 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/poster.py
模型自述报告REPORT.md

1. 读到的照片

一张横向照片,拍的是一座石造回廊的内侧。光线是阴天的均匀冷光,没有明确的方向性光斑。

画面上方是连续的尖拱,石色偏冷灰。左上方一块石壁刻着铭文,能读出 “TO THE GLORIOUS MEMORY…”、“GREAT WAR 1914–1918”,以及一段关于 “ensamples” 的引文。拱心位置有一面纹章,纹章里有盔形。更靠中的墙面上有一个十字架。墙面其余部分密排着许多人名。这些文字和纹章说明这里是一处战争纪念回廊。人物关系只取最平常的解读,不另编情节:三个人站在一起看这面墙。

三个人都背对镜头,站得很近,脚在同一地面上,视线朝向面前的铭文墙,略微向上。

  • 左:深色中长发,浅黄羽绒服,深色长裤,白袜,黑运动鞋。肩侧有一只黑白斑点的包。
  • 中:个子最高,短灰发,戴眼镜(右侧能看见镜腿),亮橙色羽绒服,下摆露出一点格子衬衫,牛仔裤,黑运动鞋。
  • 右:较矮,浅褐色头发,黑羽绒服,领口有一圈白边,黑裤,黑鞋。

他们面前大约齐大腿的高度有一条低垂的金属链,是回廊里的隔离链,人站在链后。

能认出这一幕的细节:三件外套的颜色(浅黄、橙、黑)、背影、中年人的眼镜、哥特尖拱、石墙、链。

2. 故事

三个人并排停住,把同一道视线抬向高处。

3. 取舍

保留:

  • 三个人作为一个整体。他们肩并着肩、共用一条脚底线和一道视线,是这张照片里唯一的人物中心。拆开就变成三个焦点。
  • 一件尖拱。它是他们所在的地方,也是视线被抬高的原因。只保留一个拱券,不复刻整列回廊。
  • 三件外套的颜色。这是背影里最能被认出来的东西。
  • 中年人右侧的镜腿。手绘细线只放在这里。
  • 拱券短短的向下转折(柱墩的起头),让拱不是被切断的符号。

删掉:

  • 铭文、年份、人名、十字架、纹章和盔形。它们会把画面直接读成死亡或战争。文化属性留在“停下来、往上看”这件事里,不画成图标。
  • 斑点包、格子衬衫、鞋标。尺度太小,画出来只是噪音。
  • 隔离链。试过画成悬链上的链环,在这个尺度上读成一条装饰性虚线,而且横在身体前方时像束缚。阈值改由人物与拱之间那一头高的空白来承担:他们看着,但不跨过去。
  • 其余拱券、地砖、柱列。留白就是那面墙,不必再画一面墙。

4. 几何框架

模数是最高那个人的身高 FH = 500(短边的 25%)。

  • 拱是等边尖拱。跨度 SPAN = 2 × FH = 1000,半径等于跨度。两个圆心就是两个起拱点:左 (660, 1114),右 (1660, 1114)。拱轴 x = 1160。内拱顶点 (1160, 248),外拱顶点约在 y = 161。拱带厚度 76。
  • 起拱线在 y = 1114。最高的头顶在它下方一头的距离(HEAD_H = 64),即 y = 1178。这一头高的空白是“看”的距离。
  • 三人共用脚底线 y = 1678。
  • 橙色的人(视觉上的颜色中心)站在拱轴左侧 150 像素,x = 1010,避免人被收成拱下的徽记。左人 x = 809,右人 x = 1196,肩距约 4–8 像素,几乎相切。
  • 动势场从橙色的人的头顶指向内拱顶点,方向由这两点决定,边界是内拱(两圆的交)和到顶点距离的 68% 处。
  • 竖排中文的轴是外起拱点横坐标的一半:(660 − 76) / 2 = 292。标题的垂直中心对齐拱的垂直中点。注释的顶对齐最高的头顶。
  • 英文标题的左端在右起拱点之外 76 + 0.22 × FH 处,基线落在起拱线上。

辅助线、圆心、十字、网格都没有画出来。起拱被感觉到,是因为拱带在那里转成垂直的短柱墩,以及英文坐在同一条水平线上。

5. 配色

纸色 #F5F3EE(245, 243, 238)。照片里的石灰岩大约是 (141, 139, 141) 到 (167, 164, 171),冷、中性。纸取同一色温,但提亮到明亮的冷米白,不发黄、不做旧。

深色 #242C30(36, 44, 48)。来自黑外套 (42, 49, 54) 和头发、裤脚的冷阴影。用于头发、裤、鞋、拱的淡版、文字和动势场。拱是同一支墨的淡印(覆盖率约 0.40,再加磨损),不算新的颜色。

橙色 #DC6A43(220, 106, 67)。来自橙色羽绒服。照片里最鲜的取样大约是 (196, 81, 54) 到 (224, 110, 84)。印在浅纸上会变暗,所以墨色取亮端,叠底后大约是 (211, 101, 63),仍是夹克橙,绿色分量够,不会读成血。

黄色 #EBD88A(235, 216, 138)。来自浅黄羽绒服,照片里大约是 (229, 220, 189) 到 (206, 198, 162),很淡。若按原样印在近白的纸上会消失,所以略微提纯,叠底后大约是 (226, 206, 129),仍是黄油色,不是荧光。

全图三种墨:深色、橙、黄。同色淡版(拱、动势场)不另算。

6. 动势场

转化的是他们共同的视线:人是静止的,运动在“往上看”。

逻辑只有一种:上升。原点是最高的头顶,方向指向内拱顶点,略向右偏。标记从起拱线之上开始——头顶和第一粒墨之间留着那一头高的空白,所以没有东西从身体里冒出来。密度在离开头顶约 40 到 160 像素处最高,然后按指数衰减,到顶点距离的 68% 处归零。再往上,拱里是空的纸。横向扩散随距离略增,但被限制在视线方向两侧,不向四面辐射。

边界由内拱决定:点必须落在以两个起拱点为圆心、半径为跨度的两圆的交集里,并且在起拱线之上。

构成是粗糙网点、细颗粒和断续的上升短线,全部用深色墨,不是橙色。靠近核心密一些,向外变疏、断开,最后消失。

7. 配文

  • 标题:同一行 / THE SAME LINE
  • 注释:看即停留 / To look is to remain.

「同一行」竖排在左缘,轴在 x = 292,垂直中心对齐拱的中高。它不描述画面里有什么,说的是他们共用的那一行——站的一行,也是看的一行。

英文标题大写、加字距,基线落在起拱线向右的延长线上,从拱的外侧开始,不进入拱内。它参加的是那条水平秩序,不是贴上去的说明。

「看即停留」竖排在同一条文字轴上,顶与最高的头顶齐平,顺着身体的高度往下走,但离人很远,在左缘的纸里。英文注释用斜体,左端与英文标题对齐,放在它下方一行。

自查:四句都没有提到拱、人、墙、外套或人数。不能当作画面说明来用。没有时间、地点、署名或水印。

8. 不良联想自查

单独看完稿:第一眼是三个穿亮色冬衣的人站在一座石拱下面,安静地往上看。橙色是一件有帽子、下摆和袖子的外套,下面接着腿,不是污迹。动势场是拱里的灰色印刷痕迹,在身体上方,随距离变稀,不贴着后背,也不向下拖。

为此做过的调整:

  • 不画十字架、纹章、盔、年份和人名。
  • 动势场不用橙色,不从身体出发,和头顶之间留出空白。
  • 橙色版上只有细碎的纸点,没有向下的拖痕,也没有大块破洞(破洞贴在躯干上会像伤口)。
  • 链条不画。横在身前的链会像束缚。
  • 黑衣领口曾试过用露白做白衬,结果像一个洞或一只眼睛,已去掉。
  • 样条曾经把肩线拉成尖角,像耳朵或角,已改成单调下行的轮廓。

没有血迹、伤口、暴力或死亡的图形。尖拱在没有十字的情况下读成建筑,不读成墓碑。

9. 逐条自检

第 2 节:

条结果依据
1 只能用代码作画✓全部形状由坐标、圆弧和多边形生成;肌理由种子噪声和程序放置的磨损产生。
2 不用图像生成或视觉模型✓只有 Python、Pillow、NumPy。
3 生成程序不读照片✓src/poster.py 不打开 reference.jpg。颜色和坐标是手写常量。
4 不用外部图形素材✓没有贴图、笔刷、图标或模板。只用系统已有的 Noto Serif CJK SC 与 Liberation Serif。
5 不用预装 skill 或旧项目✓从空目录写起,没有调用海报类 skill。
6 可复现✓种子 20261026。连续两次运行的 SHA-256 同为 a6476714aabe30a1999be02d4ea14bd9557c519c2687e2b9c126d70e03608041。
7 一张平面海报✓3000×2000,RGB,无透明,纸色铺到四边,无样机、无外边框、不与照片拼接。

第 4.2 节:

项结果依据
核心母题一个,辅助形不超过三个✓母题是并排的三个人(一个群体、一个视线)。辅助形是一座尖拱。镜腿是识别用的手绘线,不是另一个形。
几何框架含圆或弧与轴线,元素由它推出,辅助线不画✓等边尖拱的两段圆弧,加拱轴、起拱线、脚底线。文字和动势场都落在这些关系上。
人物高度不超过短边的 35%✓最高 500 像素,为 2000 的 25%。
只有纸的面积不少于 50%✓程序统计有墨像素占 5.6%,纯纸 94.4%。纸纹不计为墨。
色版有断墨与磨损,边缘清晰,正片叠底,错位 1–4 像素✓拱错位 (2, 1),黄 (-2, 1),橙 (2, −1)。边缘由蒙版保留,磨损只发生在内部。
纸色一种 + 深色一种 + 主题色一到两种,不超过四种墨✓纸、深色、橙、黄。拱和动势场是深色的淡版。
动势场恰好一个,密度衰减到零✓只有上升。到顶点距离的 68% 处截止,且被内拱裁切。
手绘线只用于识别细节,短、抖、断✓只有中年人右侧的镜腿:数笔短线,重复、轻重不一。没有用它描整个人。
纸有程序生成的纤维、斑驳、颗粒✓低频纸浆、细颗粒和约 4200 条短纤维,对比压得很低,纸仍是亮的。
中文标题、英文对应、一到两条注释,至少一处竖排,只有配文✓「同一行」竖排;英文标题在起拱线上;「看即停留」竖排,英文注释在其下。
不引起血迹、伤口、暴力、死亡等联想✓见第 8 节。橙色封闭在外套轮廓内;动势场是冷灰色,不贴身体。

10. 实现摘要

语言:Python 3。库:Pillow、NumPy。未另装依赖。

字体:/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc 索引 2(Noto Serif CJK SC);/usr/share/fonts/truetype/liberation/LiberationSerif-Regular.ttf;同目录的 Italic。

  • 纸:在终稿分辨率上叠三层低对比噪声,再画短纤维。纤维和斑驳都在墨的下面。
  • 色版:形状在 2 倍分辨率用多边形和椭圆绘制,缩小得到平滑边缘。磨损是内部的不规则斑块、横向干笔和细点,边缘一圈用腐蚀保护,保持锐利。人体版几乎不打缺口,避免躯干上的洞被读成伤口;拱的磨损更重,像拓片。叠印用正片叠底。
  • 动势场:固定种子的拒绝采样。沿视线方向取指数距离,横向高斯,裁到内拱内。网点、颗粒、短线和少数断开的轨迹共用同一条衰减。
  • 手绘线:镜腿是几段带抖动、重复和断笔的短线,画在 2 倍分辨率上再缩小。
  • 文字:逐字竖排;英文按字距逐字母绘制。文字基本保持清晰,只有很轻的颗粒,避免笔画被磨断。
  • 错位:深色版 (0, 0),拱 (2, 1),黄 (-2, 1),橙 (2, −1)。

生成命令:

./run.sh

等价于在本目录执行 python3 src/poster.py。输出 poster.png。

11. 已知不足

  • 人物仍然偏符号。羽绒服的体积和三色能被认出来,但腿和鞋是简化的色块,帽子和肩的衔接有一点鼓。放大看,不如拱和文字那么从容。这是为了守住平涂色版、不画成写实插画,也是多次修改后留下的限度。
  • 镜腿很小。放得再显眼就会像从头上伸出的一根线。现在只在近看时才找得到。
  • 拱仍然是画面里最大的形。它用淡墨和磨损退到人后面,但远看时拱比橙色更先被看到。人没有再放大,是为了留出那一头高的距离,也为了不超过短边的 35%。
  • 动势场偏轻。上升的逻辑在近处清楚,远处更像一小片灰。加重就会在拱底结成一团,像烟或污迹,所以保持稀疏。
  • 纸纹在正常观看距离下很轻。加重会发脏,和“明亮、不做旧”冲突,所以宁轻。
14

Muse Wonder

Muse Wonder 生成的海报《时间在此放轻脚步》
点击海报放大 · ← → 翻看
我的主观评价

配文是我最喜欢的。然而人物和碑文的空间关系让人困惑。动势场和人物的头部重叠,有点晕眩感。

海报配文
「时间在此放轻脚步」Time slows its step here
故事
三个人在一面刻满名字的墙前站住,把脚步和时间都放轻了。
↓ 完整文件包 ZIP · 7.9 MB ↓ 海报原图 PNG · 6.3 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/poster.py
模型自述报告REPORT.md

1. 读到的照片

照片是横幅。一座石砌哥特式纪念建筑占据绝大部分画面:连续的尖拱门廊,粗糙的灰色石墙,拱下是浅色的纪念墙,墙上密密麻麻刻着人名,上方有十字与校徽浮雕一类的石刻。画面右半是第二、第三个尖拱与另一面刻名墙;左拱下方、靠下偏左处站着三个人,都背对镜头、面朝左面刻名墙:

  • 中间一人个子最高,穿橙红色横纹羽绒服、浅蓝牛仔裤,灰发,侧面能看到一点眼镜,身子微微朝左;
  • 左边一人略矮,穿浅黄色羽绒服、深色长裤,深发,身子朝中间那人倾;
  • 右边一人明显更矮小,穿黑色羽绒服、黑裤,棕发,应是年纪更小的一位。

三人挤在一处站着不动,视线共同落向他们面前的刻名墙。三人前方低处横着一根铁链栏杆,把站立区和纪念墙隔开。地面是石板,光线是阴天的平光。

对其关系取最平常的解读:这是一组一起来参观纪念墙的同行者(很可能是一家人),正在安静地读墙上的名字。不编造他们的身份、亲属关系细节或此行目的。能认出原物的识别细节有:尖拱、刻满人名的浅色墙面、铁链、中间那人的橙色羽绒服与眼镜、左边黄色羽绒服、右边孩子的黑色羽绒服和浅色发带。

2. 故事

一句话:三个人在一面刻满名字的墙前站住,把脚步和时间都放轻了。

3. 取舍

保留(构成核心母题的必要部分):

  • 一个尖拱:它是建筑最有辨识度的结构,也是推出全部几何框架的母形;
  • 三个人的背影小影:黄、橙、黑三件羽绒服是照片里最鲜活的颜色与关系;
  • 拱内一面浅色刻名墙:以短横刻痕抽象人名,不写可读文字;
  • 铁链:唯一辅助叙事形,说明"隔着一点距离观看"这层关系。

删掉:

  • 第二、第三个尖拱及右面整面墙、校徽浮雕、十字、石墙砌缝、地面拼花、墙上可读的悼念铭文。删校徽与十字是避开通俗的符号化复刻、也避免画面滑向宗教装饰;删多余尖拱是为了只留一个视觉中心、留出大面积空白;删可读铭文是因为画面文字只能是配文,不能混入照片原有文字。
  • 人物的一切面部与写实细节:只保留背影、羽绒服分格线、眼镜、发带。

辅助形共两个:刻名墙面、铁链(拱座基线是拱自身的底座,不另计)。

判断说明:三人中谁是成人、谁年纪小,只按身高与站位作最平常的判断;不给他们设定姓名与具体亲属称谓。

4. 几何框架

画布 3000×2000(照片横向,故海报横向,短边 2000)。

尖拱用经典的双圆相交构造推出,其余元素全部向它对齐:

  • 拱轴线:x = 1200(竖直);起拱线(springing line):y = 920;
  • 左弧圆心 O_L = (1312, 920),右弧圆心 O_R = (1088, 920),两圆心关于轴线对称、相距 224;
  • 三层同心(同圆心)半径构成比例递进:外拱 R = 560(拱尖 y ≈ 371)、内拱 R = 440(拱尖 y ≈ 495)、刻名墙面 R = 408(墙尖 y ≈ 528)。拱带宽 120,三层共用同一对圆心与同一条轴线;
  • 拱柱自起拱线竖直向下到基线 y = 1580,基座横线沿 y = 1580 展开,左端 x = 640 与铁链左锚点、微型注释的左缘大致对齐;
  • 三人组:整体横向范围 x ≈ 928–1410,组中心约 x = 1170,贴近拱轴线;最高一人(橙衣)头顶 y = 950、脚底 y = 1580,高 630,为短边的 31.5%;三人脚底、拱柱底、基座共用同一条基线;
  • 铁链:一条悬链线,两端锚在左右拱柱内侧(x = 772 与 x = 1632, y = 1388),中点下垂 78 至 y ≈ 1466,端点恰落在拱带宽度之内;
  • 动势场圆心 G = (1195, 1085):在轴线上、位于三人视线高度,半径自 90 向外递进到 470,与拱的三层半径同属一套"以轴线为中心的弧";
  • 排版:竖排中文标题的列 x = 2478,与拱轴线平行、相距 1278;英文标题以该列为中心居中、位于 y = 1468,与基线接近;微型注释左缘 x = 664,与基座左端 x = 640 近似对齐,沿基线下方的留白边缘排列。

画面中不画任何辅助线、圆心、网格或标记点。

5. 配色

全图四种墨色加一种纸色,均在代码里手写:

角色色值来自照片哪里为什么
纸色#F2F0E9受光的浅色纪念墙与阴天石面的亮部照片整体偏冷,选冷米白,保持明亮不发黄
深色#2B3236三人的头发、黑羽绒服、鞋、铁链阴影、石墙最暗部作剪影、文字与全图骨架
主题色 1#E05C26中间那人橙红色羽绒服照片里面积不大却最醒目的一块暖色,是"人还在"的温度所在
主题色 2#E9C53E左边那人浅黄色羽绒服与橙同为暖色家族,体量减半,只作呼应不抢中心
主题色 3(石色)#74868C灰蓝石墙、拱与中间那人的牛仔裤冷色退后作建筑与墙面;其淡版即墙面浅 tint 与牛仔裤,不另算颜色

石色的淡版(同色低浓度)用于刻名墙面填充,避免引入第五种颜色。橙色只用于中间一人的衣服,不用作轨迹、光晕或背景色块。

6. 动势场

转化对象:三人共同的注视,以及注视在一面刻着很多名字的墙上停住之后那种安静的回响感。不选坠落或流动(画面里没有这类运动),只选一种逻辑: 涟漪般的回响——以视线落点附近的 G 点为圆心、一圈圈向上张开的弧。

实现:同心弧上的石色网点与少量断续弧线,半径 90→470,点的密度与大小按 exp(−(r−90)/170) 衰减到零;只取向上扇面(−168°~−14°);边界被刻名墙面的内轮廓裁住(x 905–1495、y 545–1040),不出墙、不拖到人身上、不向画面外蔓延,最终在墙的上部稀疏消失。方向与边界都由第 4 节的圆心与半径体系决定。

7. 配文

  • 中文标题:「时间在此放轻脚步」
  • 英文标题:"TIME SLOWS ITS STEP HERE"
  • 微型注释(一条,中英):「沉默自有回声」 / "SILENCE KEEPS ITS ECHO"

位置与理由:中文标题竖排在画面右侧的大留白里(列 x = 2478,与拱轴线平行),让右侧空白参与构图而不是空置;英文标题横排居中于该列下方、靠近基线高度,与中文列构成一个排版组;微型注释放在左下基座下方的留白边缘,体量最小,只作远处的一句低语。三处文字深浅与字号递减,不与拱争视觉中心。

是否在描述画面自查:两句话都没有出现人物、墙、拱、观看等画面名词,不能直接当作这张图的说明文字;它们写的是"在此处时间变慢、沉默有回响" 的情绪与隐喻。初稿微注曾写"有些注视,不需要言语",自查时认为太接近画面动作的直接描述,已改掉。

8. 不良联想自查

定构思与成品后各单独看过一遍整图。设想没见过原照片的读者第一眼会读到:一个石色尖拱、三个人(黄、橙、黑)站在一面浅墙前、一条细链、右侧竖排文字。可能的风险点与处理:

  • 原照片题材与纪念有关,但成品里不画任何与伤亡直接相关的符号:无十字、无可读人名悼文、无旗帜武器;刻名只抽象成浅灰短横,远看是一面安静的墙。
  • 橙色只限定在中间一人的衣服版内成一整块,不拖尾、不飞溅、不从人身后向外扩散;动势场不用红/橙,只用石蓝灰点,位于人头顶上方的墙面内,密度向上衰减,避免被读成从身体发出的东西的联想。
  • 纸面与色版肌理的斑点浓度低、颜色浅,不形成污渍或血迹状斑块;成品中复查过人物周围与链条附近,没有深色放射状拖痕。
  • 链条画为细的椭圆环链、端点固定在拱柱上,不悬空、不缠绕人物。

调整记录:第一版铁链两端伸到拱外、端点是漂浮圆点,看着像悬空的球,已改为锚在拱柱内侧;动势场初版弧线过密、像指纹压在人头上,已疏化为以点为主、只保留少量断线。

9. 逐条自检

第 2 节硬性限制:

#要求结果依据
1只能用代码作画✓全部图形、肌理由 src/poster.py 的坐标、多边形、圆弧公式与固定种子噪声生成
2不用图像生成/预训练视觉模型✓未调用任何此类模型、API 或服务;只用 Pillow、NumPy 画图
3生成程序不读照片✓生成程序只打开字体文件、只写 poster.png;坐标与色值均为手写数字。源码里无任何读取照片的代码
4不用外部图形素材✓无剪贴画、图标、纹理图片或模板;唯一外部资源是系统自带的 Noto Serif/Sans CJK 字体
5不用预装 skill、插件、旧项目代码✓未调用任何海报类 skill 或模板;代码从空目录新写
6可复现✓全部随机源固定种子(20261028 及派生);连续两次运行 SHA-256 相同:95aa389c8ab8681c9eb4a2f1d1aa7363c01e647752adc5640a088e961492f173
7一张平面海报✓单张 3000×2000 PNG,纸色铺满四边,无相框、样机、拼图或外边框,无透明通道(RGB)

第 4.2 节规格:

项结果依据
核心母题一个、辅助形 ≤3✓母题为"尖拱下的三人背影";辅助形两个:刻名墙、铁链
几何框架含圆/弧与轴线、且不画辅助线✓双圆尖拱 + 轴线 x=1200;所有元素对齐关系见第 4 节;画面无任何辅助线、圆心、网格
人物高度 ≤ 短边 35%✓最高一人 630/2000 = 31.5%
无墨留白 ≥ 50%✓以与纸色差 <12 的像素粗测得约 85%(含纸纹噪声的保守口径),目视亦然
色版:断墨磨损、边缘清晰、正片叠底、错位 1–4px✓每版 mask 内芯加噪声磨损与露白孔、边缘环保持实墨;四版以 multiply 叠印;错位分别为石 (−2,1)、黄 (2,1)、橙 (3,−2)、深 (0,0)
配色 ≤ 四种墨色✓深、橙、黄、石四种;墙面与牛仔裤为石色不同浓度
动势场恰好一个、一种逻辑、密度衰减到零✓仅回响弧点场,指数衰减,见第 6 节
手绘线只用于识别细节✓仅羽绒服分格线、帽兜轮廓、眼镜、发带、鞋底、链环,短线带抖动与断口
纸张有程序生成的质感✓高斯细颗粒 + 低频斑驳 + 2600 根随机纤维线
文字要求✓中英标题 + 一条中英微注;中文竖排;画面只有配文本身,无日期地点署名等
不良联想✓见第 8 节

10. 实现摘要

  • 语言与库:Python 3.12,Pillow 13.0.0(绘图、字体、MinFilter 腐蚀), NumPy 2.5.4(纸纹与色版肌理的数组运算)。字体:系统 /usr/share/fonts/opentype/noto/NotoSerifCJK-*.ttc、 NotoSansCJK-Regular.ttc。
  • 纸张:底色上叠高斯噪声、低频放大噪声斑驳,再画随机短纤维线。
  • 色版肌理:每版先画实墨 mask,用 MinFilter(7) 取内芯;内芯乘随版噪声(细颗粒 + 横向干笔条纹),高噪声处打露白孔,边缘环保持实墨以守住锐利边界;各版按手写偏移量平移后作正片叠底(multiply)合成。
  • 动势场:按第 6 节的同心弧采样,逐点以衰减概率决定是否落点。
  • 手绘线:hand_line() 把折线加密后逐段加随机抖动、随机线宽与随机断口,最后以半透明深色叠在合成图上。
  • 文字:先画进深色版的 mask 再参与叠印,使字也有印刷颗粒;竖排中文逐字沿列排布,英文逐字加字距排布。
  • 生成命令(一条,可重复执行):

    ./run.sh

    等价于 python3 src/poster.py,输出本目录 poster.png。

11. 已知不足

  • 三人仍偏图标化:羽绒服是平直的多边形加分格线,袖子与身体的分离、站姿的细微差别(中间人微微侧身、左人倾靠)只做了最低限度表达,离"安静的手绘记录"还有距离;
  • 眼镜只在中间人头部右侧留了一小圈线,缩小看几乎读不到,是识别细节里最弱的一处;发带同理,仅一条浅线;
  • 刻名短横在上半墙排得略整齐,放大看更像抽象文本行而非石刻的深浅,原照片中名字满墙的密度感被有意压低了(为留白让路);
  • 动势场的回响弧在拱内偏淡,第一眼可能先被读成墙面的弧形装饰,需要结合微注"沉默自有回声"才落到注视的回响上;
  • 砍掉左右两个尖拱后,原照片门廊横向延续的空间感没有了,换来的是单拱的纪念碑式集中——这是取舍的代价,记录在此。
15

Qwen 3.8 27B

Qwen 3.8 27B 生成的海报《有人记得》
点击海报放大 · ← → 翻看
我的主观评价

为了不引起负面联想,绝大部分模型把十字架的意象明确排除。这是使用了十字架元素的唯一模型。铁链画的像有倒刺的铁丝。动势场不明显。开始的时候海报被画出了竖幅,直到最后写报告的时候才检查出来并纠正。

海报配文
「有人记得」Someone remembers
故事
有人来把名字念出声——念过的人,就离死者近一些。
↓ 完整文件包 ZIP · 2.6 MB ↓ 海报原图 PNG · 1.0 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/gen.py · src/tools/crop.py · src/tools/fonts.py · src/tools/grid.py · src/tools/measure.py · src/tools/pcrop.py · src/tools/sample.py
模型自述报告REPORT.md

海报 poster.png(3000 × 2000,横向,RGB,无透明通道)由 src/gen.py 完全用程序绘制。生成命令:./run.sh(等价于 python3 src/gen.py)。随机种子固定(SEED = 20261027),同一台机器上重复运行输出字节完全相同(已用 sha256 验证两次运行一致)。


1. 读到的照片

场景:一堵灰色石砌的哥特式纪念墙,连续的尖拱(lancet arch)开间。最左边的拱龛里刻着十字和铭文“TO THE GLORIOUS MEMORY OF MEMBERS OF THIS UNIVERSITY WHO FELL IN THE GREAT WAR 1914–1918”,拱内墙面刻满密密麻麻的阵亡者姓名(大写拉丁字母,名字之间以 “+”“÷”分隔,按字母分节,有 A、B、C、D 大写字母标记)。这是爱丁堡卡尔顿山苏格兰国家战争纪念塔(Remembrance Arch)的一部分。地面是湿润的石板,有深浅相间的方格铺装。

三个人(都背对镜头):

  • 左边:淡黄色羽绒服(连帽放下),深色头发带灰白,深色窄腿裤、深色鞋;头微微低下、侧向中间,一只穿豹纹袖的手搭在中间人的背上——姿态是凑近、相依着看。
  • 中间(最高,最靠近镜头):铁锈红/赤陶色羽绒服(立着的领口/兜帽堆在肩上),短灰发,戴眼镜(从背后能看到镜腿),浅蓝牛仔裤、露出一点格子衬衫下摆、灰色运动鞋。
  • 右边:黑色羽绒服(兜帽戴在头上,白色帽沿),棕灰色短发,黑裤子、黑鞋。

视线:三人的脸都朝向石墙,略向上,落在姓名铭文的区域——他们在读名字。 关系:肩并肩、手臂相搭,最平常的解读是亲友结伴来凭吊、查名字。 能认出身份的细节:尖拱与拱肋、刻名石墙、十字铭文、隔开参观者与纪念墙的矮链子(链子在三人身后、约大腿高度,两端固定在墙上)。 色彩:整张照片是冷灰的石色;唯一鲜活的颜色是那件铁锈红羽绒服和那件淡黄羽绒服。

2. 故事

有人来把名字念出声——念过的人,就离死者近一些;海报讲的正是这个“读”的瞬间。

3. 取舍

保留:

  • 三个人(核心母题):只保留“三个穿羽绒服的背影、肩并肩、朝墙”的姿态关系,以及各自的色彩身份——中间铁锈红、左边淡黄、右边全黑。
  • 一座尖拱:它既是照片里最强势的结构,也是整套几何矩阵的来源。
  • 矮链子:照片里“生者与纪念区之间”的分界,也是识别这个地点的细节。
  • 十字:左龛里刻在铭文上方的十字,是“这是纪念墙”的关键识别点。
  • 刻名墙:转化为动势场(见第 6 节),保留“满墙名字”的密度感而放弃全部文字。

删掉:

  • 第二、第三座拱和全部柱列(照片的重复节奏)——只留一座,保证“一个视觉中心”。
  • 铭文的真实文字——转成长短不一的短划,只留“行”的节奏。
  • 地面铺装、湿痕、拱肋上的浮雕花纹、兽首、纹章等所有次要雕刻。
  • 豹纹袖子(太小太花,画出来会变成噪音)。
  • 牛仔裤的具体颜色与格子纹——为守住“四种墨色以内”的预算,三条腿合并为深色墨版;中间人只保留“格子衬衫下摆”这一小块,用铁锈色叠印在深色上(= 两版重叠的混色)暗示。

4. 几何框架

全部位置由同一套矩阵推出:

  • 一条轴线:x = 1450 的竖线,即拱的轴线(照片里拱的中线;画面刻意偏左于画布中心 1500,制造不对称)。
  • 一条地平/起拱线:y = 1620。拱脚(springer)落在人站立的地面上——人和拱共享同一条基线,这是整张图最底层的秩序。
  • 两个圆:尖拱由两条圆弧拼成,半径 R = 1415.2,圆心都在起拱线上、且越过轴线(左圆心 x = 2225.2,右圆心 x = 674.8)——这是尖拱(lancet)的标准“交叉圆心” 构造,比例照抄照片:拱顶高 / 半跨 ≈ 1184 / 640 ≈ 1.85(照片实测 860 / 465 ≈ 1.85)。拱顶(内缘)在 y = 436,外缘拱顶在 y ≈ 318。
  • 拱带:内圆与“半径 + 100”的外圆之间的环形带,即那块 100px 厚的深色版。

各元素对齐的关系:

  • 三人组站在轴线上 x = 1330(轴线左侧 120,照搬照片里“人略偏拱中线左”的位置),脚底在起拱线上。
  • 十字在轴线上 (1450, 620)——拱顶正下方、名字场正上方,同轴。
  • 链子两端锚在两个内起拱点附近(812–2088),下垂最低点恰在轴线上。
  • 名字场被内圆弧解析地裁切(代码里用圆方程判断,不画任何辅助线)。
  • 标题“有人记得”的竖排字心线在 x = 3000 − 2×100 = 2800(距右边缘恰好两个拱带厚);首字顶端与内拱顶(y ≈ 436)同高。
  • 左侧竖排英文“someone remembers”的底端正好落在起拱线 y = 1620 上。
  • 左下中文小字与英文竖排共用同一条左轴 x = 24。
  • 没有任何辅助线、圆心、网格、标记点被画出来。

5. 配色(全部实测自照片)

角色色值来自照片的哪里理由
纸色#F3F1EA (243,241,234)石墙高光 (177,174,181)/(182,179,187)、亮石板 (171,168,174) 的色相方向(冷灰偏蓝)照片色温偏冷,所以选“冷米白/象牙”一侧;但纸必须明亮、不发黄,故把 170 左右的灰提亮到 234–243
深色墨#262A2E (38,42,46)黑羽绒服 (19,27,28)/(23,32,36)、阴影里的石头 (54,57,54)/(69,70,64)照片里最深的颜色;构建拱、腿、鞋、文字、十字、链子
铁锈红#C65840 (198,88,64)中间人羽绒服中部 (195,110,90)→(187,101,85) 的中调全照片最鲜活、最有“人”的温度的一色;它是画面唯一的重音
淡黄油色#CDC596 (205,197,150)左边人羽绒服 (214,209,163)/(188,181,137)照片里第二主题色,本身就是浅色;与红并列时让红更跳

全图只有这四种墨(纸 + 3 种墨)。拱外侧的淡红/淡黄“套印错位”影、拱上磨损露白、右人兜帽的白边,都是同一色相的淡版或纸面本身,不另计新色。中间人下摆的“格子衬衫” 是红版叠在深版上(乘式叠印出的暗红棕),不是新色。

6. 动势场

照片里最真实的“运动”是视线和阅读方向:三张脸朝墙,眼睛从左往右一行行扫过名字。我把它转成恰好一个动势场:

  • 运动逻辑(只选一种):朝右流动(阅读方向)。每一行短划带 0°–3.5° 的轻微右倾,并且离核心越远,断口越多、碎得越厉害——像一行名字读到远处就散了。
  • 组成:2–4px 的短划(14–60px 长)+ 少量 2px 圆点(对应刻名里“+”分隔符的节奏)。
  • 密度:以三人视线汇聚点 (1320, 1060) 为核心,按 exp(−d/400) × 行高斯 衰减,到边界处归零,最终消失在留白里。靠近核心处短划长、密、深(alpha 至 175),远处短、断、浅。
  • 边界:完全由几何框架决定——被拱的内圆弧解析裁切(圆方程判断,y 方向在 780–1470 之间),并在十字周围 (±175, ±150) 留出一个空区,让十字像照片里那样“浮在名字上方”。
  • 没有叠加第二种动势(没有辐射、没有坠落、没有涟漪)。

7. 配文

  • 主标题(中文,竖排,右侧):有人记得
  • 英文对应(旋转 90° 自下而上读,左侧边缘):someone remembers
  • 微型注释 1(中文,左下,宽字距):念过,就不算远
  • 微型注释 2(英文,主标题下方两行):to be read / is to be kept

位置:见第 4 节的对齐关系——标题在右边缘两个拱带厚处、与拱顶同高起笔;英文在左留白里、底端落在地面上;中文小字与英文共用左轴,沉在画面下缘。文字全部沿几何轴线或留白边缘排布,竖排 + 旋转共两处非水平排布。

自查是否在描述画面:“有人记得”说的是一种内心状态(有人在记挂),不是“三个人站在墙前”;“念过,就不算远”说的是朗读这个动作的后果(距离感消失),不是画面说明; “to be read is to be kept”说的是“被念 = 被留”的抽象关系。四句都不能直接当画面说明用(画面里并没有出现“记得”这件事本身,只出现了读的人),通过。画面上没有时间、地点、署名、水印、风格名。

8. 不良联想自查

把整图单独放远看了一遍,设想读者第一眼可能产生的联想及对策:

  • 深色大拱像什么:可能读成“阴影/门洞/墓碑轮廓”。对策:保留石纹肌理(断墨、磨损、露白)、淡红套印错位影、以及拱内的十字,让它明确是“纪念建筑的拱”,而不是空洞的黑形。
  • 铁锈红会不会被读成血迹:这是最需要防的。对策:① 红色只作为一件衣服存在,有头、有缝、有下摆、有手臂,形态完整;② 全图没有任何从人身后拖出的红/橙颗粒—— 名字场用的是中性墨色而非红色;③ 红与纸色之间隔着大面积留白,没有“晕开”的痕迹。
  • 一排排短划会不会像灰烬/碎片在飘落:对策:短划保持水平(阅读方向)而非垂直下落,且密集区在人的视线高度而不是地面,配合十字读作“墙上的名字”。
  • 三个人站在暗拱下会不会阴森:对策:两个暖色(红、黄)把“活着的人”标出来,纸色明亮,链子位置低(大腿高)且人站在链子外侧、姿态放松相依,读作“凭吊”而非“被困”。

9. 逐条自检

第 2 节 7 条限制:

  1. 只用代码作画 — ✓ 所有图形是 gen.py 里的坐标/圆方程/噪声;肌理来自固定种子的随机数。
  2. 不用图像生成模型 — ✓ 没有任何模型、API、网络服务;未用视觉模型处理照片。
  3. 生成程序不读照片 — ✓ gen.py 不打开 reference.jpg;照片只被 src/tools/ 下的辅助测量脚本读过,结果以手写常量(坐标、色值)进入 gen.py(见第 4、5 节)。
  4. 不用外部图形素材 — ✓ 唯一外部资源是系统已装的 Noto Serif CJK(字体,允许)。
  5. 不用 skill/插件/旧代码 — ✓ 未调用任何预装 skill,全部代码在本目录新写。
  6. 可复现 — ✓ random.Random(20261027);两次运行 sha256 相同(3b4e3e10…cf5a1b0)。
  7. 一张平面海报 — ✓ 纸色铺满四边,无样机、无边框、不拼照片、只出一张。

4.2 规格表逐行:

  • 核心母题 — ✓ 一个(三人组);辅助形三个(拱、链子、十字),叙事意义见第 3 节。
  • 几何框架 — ✓ 两个圆 + 一条轴线(第 4 节);所有元素从它推出;未画任何辅助线/圆心/网格。
  • 主体尺度 — ✓ 最高者 640px = 短边 2000 的 32% < 35%。
  • 留白 — ✓ 程序自审计:纸色面积 90.2% ≥ 50%(按“与纸色差异 > 阈值”的像素统计)。
  • 色版 — ✓ 每色一版;版内有断墨(磨损斑)、干笔纹(细条缺口)、露白(纸面透出)、不均匀墨色(值噪声);边缘保持锐利(位掩模硬边);乘式叠印,拱与红夹克有 2–3px 套印错位。
  • 配色 — ✓ 纸 1 + 深墨 1 + 照片主题色 2(铁锈红、淡黄)= 4 种墨;淡影同色不另计。
  • 动势场 — ✓ 恰好一个,单一逻辑(向右流动);由短划/圆点/断口组成;密度随离核心距离衰减到零(第 6 节)。
  • 手绘线 — ✓ 只用于识别细节:十字、眼镜、兜帽白边、搭肩的手臂、羽绒服绗缝、鞋底;由短笔触、抖动、轻重变化、偶尔断笔组成(hand_line/hand_arc)。
  • 纸张 — ✓ 值噪声斑驳(±5 级)+ 2600 根纤维短线 + 9000 点颗粒,程序生成,非纯色。
  • 文字 — ✓ 中文标题一句 + 英文对应 + 两条微型注释;竖排中文 + 旋转英文共两处非水平;画面上只有配文本身。
  • 不良联想 — ✓ 见第 8 节;红色限于衣物,无血迹/暴力可读性。

10. 实现摘要

  • 环境:Python 3.12 + Pillow 13.0.0 + numpy 2.5.4(均为环境预装,未额外安装依赖)。
  • 字体:/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc(index 2 = Noto Serif CJK SC),标题/注释/英文全部用它(含 Latin 字形)。
  • 纸张(make_paper):三 octave 值噪声(粗网格随机 + 双线性放大)做 ±5 级斑驳;近垂直短纤维线;明暗两色颗粒散点。
  • 色版(multiply_rgba + plate_texture):每块版 = 平面色 × 剪影掩模 × 干笔肌理掩模(值噪声 + 哈希细噪声 → 干区断墨;近水平细条缺口;圆形磨损斑),按 RGBA 通道做乘式(正片叠底)混合到画面上——红叠黑自然出暗红棕,叠纸面自然变淡。套印错位 = 同一掩模平移 2–3px 再叠一层淡版。
  • 拱(arch_points):两圆圆弧解析采样成多边形(150 步/弧),不依赖描图。
  • 动势场(draw_name_field):固定行距 26px 的行,逐行走随机;是否落划由 0.018 + 0.34·行权重·距离权重 决定;长度、粗细、alpha、断口概率都随核心距离变化;用 inside_arch(圆方程)做解析裁切。
  • 手绘线(hand_line/hand_arc):把目标线折成 26px 左右的短笔触,逐笔加抖动、粗细变化,14% 概率“提笔”断开。
  • 文字(draw_text):Pillow truetype 直接绘制,逐字定位做字距;英文竖排 = 先横写在临时图上再旋转 90° 贴入。
  • 生成顺序:纸 → 拱(淡影×2 + 墨版)→ 名字场 → 链子 → 人(深色版 → 红错位影 → 下摆叠印 → 夹克版)→ 手绘细节 → 文字 → 存 PNG(RGB)。
  • 命令:./run.sh 或 python3 src/gen.py。辅助测量脚本在 src/tools/(只读照片,不参与生成)。

11. 已知不足

  • 三个人仍然偏“图标化”:躯干是圆角块,没有肩线、没有手;站姿静态。放大看能感到简化,缩小看成立——这是“符号化转换”要求的代价,但做得还不够细。
  • 尖拱在顶点处由两段 150 步的圆弧拼合,极端放大(>400%)能看到一丁点折面;印刷尺度下不可见。
  • 名字场是抽象短划,第一眼并不像“文字”,更像肌理——这正是“转换而非复刻”的风险:没看过照片的人可能读不出“那是一墙名字”。
  • 淡黄色饱和度偏低(忠实于照片),与铁锈红并排时略退;若追求更强的双色平衡可以再提一点饱和,但那样就离照片远了,权衡后保留。
  • 重心偏上:下部 19% 和左侧留白很大,安静有余、热闹不足——这是有意为之,但承认第一眼可能觉得“下面空”。
16

Haiku 5.5

Haiku 5.5 生成的海报《有人还在读》
点击海报放大 · ← → 翻看
我的主观评价

把原图中左侧人物的浅黄外套,抽离放大为一整块黄绿色的实心拱顶——这成了全场最大胆也最出格的用色,标题字号也夸张得惊人。下方人物坍缩成一团模糊的黑剪影,右侧散逸的颗粒状若游烟,构思不可谓不奇特,但整体观感实在让人摸不着头脑。

海报配文
「有人还在读」Someone is still reading
故事
一家人站在刻满名字的墙前,一起读;名字刻在石上,等着被人念出,而读的人还在。
↓ 完整文件包 ZIP · 6.2 MB ↓ 海报原图 PNG · 4.6 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/make_poster.py
模型自述报告REPORT.md

读者:拿到这份任务的评审(懂设计、但没看过照片的人)。

1. 读到的照片

  • 画面:一条石砌拱廊,正对一面长墙,墙上刻满人名,墙面是浅灰色的石头。拱顶有雕花,墙上部中央有纹章和一个小徽章。地面是浅色石板,远景边缘有一小段格纹地砖。
  • 刻字:照片左上角能辨认出一行刻字,大意是“纪念本大学在一战(1914–1918)中阵亡的成员”。这是一座大学的阵亡者纪念墙。
  • 人物:3 人,背对镜头,面朝墙站着。
    • 左:一位穿浅黄绿色绗缝外套、深色长发的人,穿深色长裤。
    • 中:一位穿橙色羽绒服、短发偏灰的人,穿蓝色牛仔裤、白色运动鞋。
    • 右:一个穿黑色羽绒服、棕色头发的孩子,穿黑裤子。
  • 视线与姿态:三人都背对镜头,朝斜上方、朝墙面中上部看;三人靠得很近,站成一排。
  • 关系:最平常的解读是一家人(两位大人、一个孩子)一起在读墙上的名字。
  • 可辨认的细节:墙边一圈低矮的链条护栏(隔开游客与墙);拱形的石柱与拱顶雕花;墙上的纹章。没有可辨认的个人身份信息。

2. 故事

一家人站在刻满名字的墙前,一起读;名字刻在石上,等着被人念出,而读的人还在。

3. 取舍

  • 保留:三个人作为一个剪影群组(核心母题);拱形(几何框架,同时是照片的建筑特征);护栏链条(唯一的手绘识别细节)。
  • 删掉:墙上的字(只留下隐喻性的配文);纹章、徽章、拱顶雕花;石板地面和格纹地砖;人物的衣物细节和发型;照片的暖冷对比。
  • 不用的颜色:橙色羽绒服。它是照片里最鲜艳的颜色,但如果放进画面,身体附近的橙红色色块或颗粒很容易被读成血迹,所以整张海报没有橙色。
  • 理由:照片的重点是“人站在墙前读名字”,这个动作需要的只有人形、拱形和一根链条。

4. 几何框架

坐标单位为海报像素,海报 3000×2000。

  • 竖轴:CX = 1900。三个人和拱顶尖都在这条竖轴上;标题竖列不在竖轴上,它位于拱左侧的留白里。
  • 拱(尖拱):半跨 A = 280,弧半径 R = 2A = 560(等边尖拱)。两段圆弧分别以对侧的起拱点为圆心:左弧圆心 (CX+A, YS),右弧圆心 (CX-A, YS)。拱顶尖位于 YA = YS − A·√3 ≈ 695。
  • 起拱线:YS = 1180。动势场的起点和走向都沿这条线。
  • 地面线:YG = 1500。三人的脚站在这条线上,拱的底边也在这里。
  • 人物:相对竖轴的偏移分别为 −62(左)、−2(中)、+98(右),身高分别为 372、405、350(均不超过短边 2000 的 35% 即 700)。
  • 链条:两根柱子位于 CX ± 760,链条两端高 y = 1400,中间下垂 70 px。两端关于竖轴对称。
  • 文字:中文竖排标题位于 x = 640 的竖列,按字距 175 排列。英文标题基线 y = 1480。注释左缘 x = 2230,即拱右缘(CX + A = 2180)外约 50 px。
  • 不画的东西:所有辅助线、圆心、网格、标记点都没有画出,只用它们决定位置。

5. 配色

名称色值来自照片的哪里为什么
纸色#F2F0E8(242, 240, 232)石墙和地面的冷灰米白照片的色温偏冷,纸色取微暖的冷米白,保持明亮不发黄
深色(墨)#22262A(34, 38, 42)深色长裤、运动鞋、黑色外套最深的暗部,用来构建剪影、文字和动势场
主题色#C9D36B(201, 211, 107)左边人的浅黄绿色绗缝外套唯一的“鲜活”色,又不会像橙色那样联想到血

注:色值是目测照片后估算的,没有用取色工具精确测量。

6. 动势场

  • 转化的运动:照片里三人的视线方向(朝斜上方、朝墙面),以及链条和拱的水平走向。
  • 选的运动逻辑:朝一个方向流动(向右,沿起拱线方向)。它从人群右侧开始,延伸到画面右侧,逐渐稀疏并消失在留白里。
  • 组成:一组网点(间距 24 px 的抖动网格,点径随距离衰减,最大约 11 px),加上约 1400 个候选断续短线(长 10–40 px,宽 2–3.2 px)。
  • 密度衰减:水平方向按 exp(−d/430) 衰减,超过约 900 px 后基本为零;纵向扩散宽度为 16 + 0.05d。
  • 边界:由起拱线(YS)决定中心线,由拱的水平跨度(A)和起点(CX + 200)决定左边界。
  • 不贴身:起点在三人右侧(CX + 200),右边的孩子的右缘在 CX + 161,所以动势场不从身体上拖出。

7. 配文

  • 中文标题(竖排):有人还在读
  • 英文标题:Someone is still reading.
  • 注释(中):石上的名字,等着被人念出。
  • 注释(英):The names wait to be spoken aloud.

位置:标题在拱左侧的留白里竖排;英文标题紧跟在竖排标题下方;注释在拱右下方,动势场下面。

自查:

  • 标题说的是“有人在读”,是一个动作和一种延续,没有描述画面里的三个人或护栏。
  • 注释说的是“名字等着被念出”,是石头和名字的隐喻,不是对画面的说明。
  • 没有时间、地点、标题栏、风格名、署名或水印。

8. 不良联想自查

整张图单独看一遍后,设想读者第一眼的联想:

  • 拱:可能被读成门、窗、教堂或墓碑形状。这是有意的:它就是照片里的拱廊。剪影站在拱里,读者更可能想到“纪念”。没有做调整。
  • 三个剪影:可能被读成一家人,或读成“三个人站着等待”。这正是要的。没有做调整。
  • 动势场(右侧的点和线):可能被读成烟、雨、飞散的东西,或信号。它不从身体上出来,颜色是深墨,没有红或橙。做过的调整:起点移到了人群右侧(CX + 200),不贴身;颜色从原来的暖色换成了深墨。
  • 链条:可能被读成锁链。它是护栏,但在海报里它很细、很碎,断了好几处,读起来更像一条线。做过的调整:链条与人体碰撞处被删掉,没有穿过身体。
  • 颜色:画面里没有红色和橙色(已测:R−G > 30 的像素数为 0)。

结论:没有发现血迹、伤口、暴力或死亡的联想。

9. 逐条自检

第 2 节:硬性限制
  1. ✓ 只用代码作画。所有图形由坐标和几何关系画出,纸张和肌理由种子固定的噪声生成。
  2. ✓ 没有调用任何图像生成模型,也没有使用预训练视觉模型。
  3. ✓ src/make_poster.py 不打开、不读取 reference.jpg(脚本里没有引用它的代码,grep reference 只命中注释)。照片观察的结果以手写数字的形式进入生成程序。
  4. ✓ 没有使用剪贴画、图标、笔刷图片或纹理贴图。唯一的外部资源是本机的 Noto Serif CJK 字体。
  5. ✓ 从空目录开始,没有调用任何 skill 或模板,也没有使用以前的项目代码。
  6. ✓ 随机数全部用固定种子。同一台机器上连续运行两次,poster.png 的 MD5 相同(c1863a3a7855d0cf7ccfb92a16259348)。
  7. ✓ 只有平面海报原稿,纸色铺满四边,没有样机、边框或拼图。
第 3 节:尺寸

✓ 3000×2000,横向(照片是横向的),RGB PNG,无透明通道。

第 4.2 节:规格表
项结果依据
核心母题✓一个:三人剪影。辅助形两个:拱(几何框架)和链条(手绘细节)。都有叙事意义
几何框架✓尖拱(两段 R=560 圆弧)加竖轴 CX=1900;人、拱、动势场、链条都由它推出。没有画辅助线
主体尺度✓最高的人 405 px,小于短边 2000 的 35%(700 px)
留白✓只有纸色的像素占约 83%(阈值:与纸色差 < 12),远大于 50%
色版✓拱和剪影各为一版,内部有断墨、磨损和露白(见下);边缘清晰。拱版 (+3,−2) 偏移,墨版 (−2,+2) 偏移,都在 1–4 px 之内。正片叠底(multiply)叠印
配色✓纸色、深墨、主题色(浅黄绿)三色,不超过四种墨色
动势场✓恰好一个,朝一个方向流动;由网点和断续线组成,密度随距离衰减到零
手绘线✓链条:短促、不等长、略抖、偶尔断开(6% 的环节缺失),不是光滑描边
纸张✓程序生成的纤维、斑驳和颗粒;不是纯色(见第 10 节)
文字✓中文标题(竖排)、英文标题、一条双语注释;竖排中文满足“至少一处”;只有配文
不良联想✓见第 8 节,没有红或橙,动势场不贴身

10. 实现摘要

  • 语言和库:Python 3,Pillow 12.2.0,numpy 2.5.4。系统 Python 不允许全局 pip install(PEP 668),所以在项目目录下建了一个本地虚拟环境 .venv(带 --system-site-packages,只额外装了 numpy)。run.sh 会优先使用 .venv。
  • 字体:系统自带的 Noto Serif CJK SC(Bold 用于竖排标题,Regular 用于英文标题和注释)。
  • 超采样:形状蒙版按 2× 绘制,再用 BOX 滤波缩到 3000×2000,边缘抗锯齿。
  • 纸张:基底色 + 低频斑驳(种子噪声,双尺度,约 ±1.75 个色阶)+ 每像素高斯颗粒(σ = 2)+ 1500 根短纤维(深色和浅色各一批,高斯模糊 0.6)。没有用任何纹理图片。
  • 墨的磨损:三尺度噪声(其中一层横向拉长,模拟干笔纹),约 7% 的像素露出纸色;墨色浓淡不均,系数在 0.8–1.0 之间。文字版不做磨损,以保证可读。
  • 套印:拱版和墨版分别偏移,再按 multiply 叠加到纸上。
  • 动势场:一层网点(间距 24 px 的抖动网格,点径随距离衰减),加上一层断续短线(约 1400 个候选,按指数衰减保留)。
  • 链条:每个环节是一个绕切线方向的椭圆(奇偶交替,一种是开口的,一种是扁的),每个点加 0.5 px 的抖动,线宽 2.4–3.6 px,跳过人体所在的区域。
  • 竖排文字:逐字用 anchor="mm" 竖向排列。
  • 生成命令:./run.sh(等价于 .venv/bin/python src/make_poster.py),输出到 poster.png,约 4 秒。

11. 已知不足

  1. 剪影偏像图标:三个人的身体是几何多边形拼出来的,肩和臂的线条偏硬,看起来仍有点像图标,没有照片里那种衣服的体积感。
  2. 拱版的磨损太均匀:白色斑点在拱版上分布得比较平均,有点像撒了盐,缺少真正的干笔方向感。
  3. 动势场的起点靠在拱的右边缘:起点 CX + 200 与拱右缘 CX + 280 之间只有 80 px,点和线会压在拱版的边上,略显拥挤。
  4. 颜色是目测的:色值没有用取色工具测量,只是从照片里估算的。如果评审要求精确的取色依据,需要另做测量。
  5. 构图偏右下:三人、拱和动势场集中在右侧中部,左上和右下有较大的空白。这是为了给竖排标题留位置,但整体平衡还可以再调。
  6. 链条的两端柱子很细:近看像刻度线,不太像护栏柱子。
17

Luna 6

Luna 6 生成的海报《静默有回声》
点击海报放大 · ← → 翻看
我的主观评价

耗时全场最短,仅用 2 分钟交卷。但画面带有明显的低幼卡通感,恰恰踩中了需求里明确禁止的雷区。

海报配文
「静默有回声」Silence answers softly
故事
几个人在沉静的空间里一同仰望,留下的文字也继续与后来者相遇。
↓ 完整文件包 ZIP · 5.1 MB ↓ 海报原图 PNG · 3.4 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/poster.py
模型自述报告REPORT.md

1. 读到的照片

照片中有三个人,均背对镜头,站在一面刻有大量文字的石墙前。中间的人穿橙红色外套,左右两人分别穿浅黄绿色和深色外套。三人都把头朝向墙面;中间人的头略抬起,像是在读上方的铭文或浮雕。无法从照片判断三人的具体关系,最平常的理解是结伴停下阅读。场景是带有尖拱石柱的纪念性拱廊,墙面铭刻与肃静的建筑氛围表明它可能承担纪念功能;不据此推断具体事件或身份。

2. 故事

几个人在沉静的空间里一同仰望,留下的文字也继续与后来者相遇。

3. 取舍

保留三人背影的紧密关系、中央橙红外套、左右两种深浅不同的衣色,以及包围他们的尖拱轮廓。三人合成唯一的核心母题;尖拱提示纪念建筑,向上的细线和颗粒把他们共同的视线转成一处动势,标题旁的小弧把排版接回拱形秩序。删除墙面具体文字、纹饰、地面、石柱细节和链条,避免把照片逐项复刻,也避免链条变成新的视觉焦点。

4. 几何框架

画幅为 3000 × 2000 横向。三个人物的组合轴线取三颗头部与躯干的共同中心,约为 x=1430;尖拱顶点落在同一轴线上。拱形以轴线两侧各约 530 像素的半宽构成,等效半径约 520 像素;两侧直段落在 x≈900 与 x≈1960,拱顶约 y=490。人物群像放在轴线下部,约 y=1150–1690,高约 540 像素,占短边 27%。动势场沿轴线上升并在拱内收束。竖排中文标题与小弧位于拱的右侧延长区域;底部微型注释沿群像下缘起排。所有位置由该轴线、尖拱曲线及其边缘关系确定,未绘制圆心、网格或辅助标记。

5. 配色

  • 纸色:#F4F3EB,清亮的微暖白。照片石墙偏浅灰且环境光冷静,因此纸色保留浅淡温度,不做泛黄旧纸。
  • 深色:#2A393A,用于拱、右侧衣服、文字和细节,概括石刻阴影与深色外套。
  • 主题色一:#CB5336,取自中间人的橙红外套,作为群像中的视觉锚点。
  • 主题色二:#BFCC9D,取自左侧浅黄绿色外套,作为低饱和的陪衬。

共三种墨色,未另加其他颜色;动势场和细节使用深色墨的不同遮罩浓度。纸面颗粒是纸底色的轻微明暗变化,不作为额外墨版。

6. 动势场

转化的是三人朝墙面抬头阅读的共同视线,采用单一的向上运动逻辑。稀疏断线与网点从三人头顶上方汇聚向拱顶轴线;颗粒横向散布随远离汇聚处而变稀。动势场完全位于人物之外,底部与头部之间留有空隙,避免轨迹被读成衣物或从身体延伸出的痕迹。边界收在尖拱内,方向由拱顶轴线决定。

7. 配文

  • 中文标题:静默有回声
  • 英文对应:Silence answers softly
  • 中文微注:留下的,也留下我们
  • 英文微注:What we keep, keeps us

标题竖排放在拱的右侧,英文对应与短中文译句并置;微注沿群像下方水平排布。它们表达记忆与回应,没有直接说明画面里有什么。

8. 不良联想自查

单独看成品,第一眼可能读成三人站在一处拱形门洞下仰望;橙红色是人物衣服的平面色版。没有从人物身后拖出的暖色颗粒或贴着身体的轨迹。最初的磨损点在放大时显得过大、像斑点,我已缩小并减少磨损点,让它只呈现轻微露纸。最终整体未发现血迹、伤口、暴力、死亡或不雅联想。

9. 逐条自检

第 2 节硬性限制
  1. ✓ 只用代码作画:人物轮廓、拱、轨迹、纸纹和排版均由 src/poster.py 中的坐标、曲线和随机数生成。
  2. ✓ 未调用图像生成模型、视觉模型、API 或网络服务。
  3. ✓ 成品脚本只读取自身代码与本机字体,不打开或采样 reference.jpg。
  4. ✓ 未使用外部图形素材;只使用本机 Noto Serif CJK 字体。
  5. ✓ 从空目录编写本项目程序,未调用 skill、插件、模板或既有项目代码。
  6. ✓ 所有随机过程固定种子 18427;连续两次运行的 PNG SHA-256 均为 59b470aa6fb97ef35f636867af6008c5225ee909ea3be7c1a848bf3561abd56a。
  7. ✓ 输出为单张 RGB 平面海报,纸色铺满画面,无样机、相框或透明通道。
第 4.2 节可核对规格
  1. ✓ 核心母题为三人群像;辅助形为尖拱(纪念空间)、向上动势场(共同视线)和标题旁小弧(连接排版与拱形)。
  2. ✓ 框架包含拱形曲线及 x≈1430 的轴线;所有元素按轴线、拱形边界或留白边缘布局,未画辅助线或标记。
  3. ✓ 群像高度约 540 px,小于短边 2000 px 的 35%(700 px)。
  4. ✓ 纸色无墨区域约占九成,超过 50%。
  5. ✓ 每种颜色分别构成色版;程序以固定种子的稀疏小缺口和短线做内部磨损,版缘仍由清晰几何遮罩限定;不同版按 1–2 px 的偏移叠印。
  6. ✓ 纸色加三种墨色,共四种颜色;未使用第四种墨色。
  7. ✓ 仅一处向上动势,由断线、网点和散点构成;散点离轴线越远越疏,并在拱内结束。
  8. ✓ 手绘线只用于少量帽兜/发际提示与衣褶,线条短、轻重有别并略带折动。
  9. ✓ 纸面由程序生成细粒度底色变化和短纤维线,不是纯色填充。
  10. ✓ 配有中英文标题与一组微型双语注释;中文标题竖排,文案表达情绪隐喻,不描述画面。
  11. ✓ 单独检查整图并调整了放大后显突兀的磨损点;未发现不良联想。

10. 实现摘要

Python 3 使用 Pillow 绘制 3000 × 2000 RGB 图像;曲线由脚本用三次 Bézier 公式分段采样,再绘成遮罩。纸底采用固定随机种子的逐像素细微变化和短纤维线;各色版在遮罩内生成露纸缺口与干笔线;动势场由程序生成的断续细线、颗粒和网点组成;手绘细节用不规则短线;文字使用本机 /usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc。无其他 Python 图形库依赖。

在本目录运行:

./run.sh

11. 已知不足

人物是高度概括的符号剪影,衣物剪裁、头部角度和三人的相互遮挡比原照片简单,无法表现真实个体差异。尖拱作为几何框架较醒目,视觉上比照片里的建筑更规整。磨损刻意压低后,印刷肌理较克制,远看更接近平面色版。

18

Terra 5.6

Terra 5.6 生成的海报《静听石上回声》
点击海报放大 · ← → 翻看
我的主观评价

尖拱被擅自改成了罗马半圆拱,直接丢掉了原建筑最具辨识度的精神图腾;拱廊立柱甚至出现了未闭合的断裂线。人物轮廓生硬方正,笨拙得宛如几个石头人。顺带一提,其余模型都规规矩矩建了 src/ 目录,唯独它和 Terra 6.1 把源码直接散落在根目录里。

海报配文
「静听石上回声」Listening for the echo
故事
三个人在石头留下的长久回声前安静地停住。
↓ 完整文件包 ZIP · 1.8 MB ↓ 海报原图 PNG · 196 KB 包内:REPORT.md · REQUIREMENTS.md · draw_poster.py · poster.png · reference.jpg · run.sh
模型自述报告REPORT.md

读到的照片

照片横向,拍的是一段石砌拱廊内的纪念墙。画面下方中央有三位相互靠近的参观者,背向镜头,面对墙上的姓名和题字;他们的视线落在碑刻上。中间的人穿橙红色羽绒服,左边的人穿浅黄色外套、背着带斑点图案的包,右边的人穿深色外套。三人的手部大多被身体遮住,能读出的姿态是并肩、停下观看。拱券、柱子、成片文字和横跨下方的链条共同说明这是一个肃静的纪念性建筑空间。

最平常的解读是:三位同行的访客一起阅读纪念碑,而不是在进行某种可确定的仪式或戏剧性行动。

故事

三个人在石头留下的长久回声前安静地停住。

取舍

保留三位背向观者、中央橙红与左侧浅黄外套、以及一座拱门的圆弧关系;它们让看过照片的人能立即认出人物组合、服装色彩和建筑空间。删去了整面碑文、柱头雕饰、砖墙、地面、链条和所有可读姓名,以免海报变成建筑复制或历史说明图。拱门只留下三道色版轮廓,作为人物共同视线所指向的空间。

几何框架

主圆圆心为 (1500, 1090),外半径为 690 px;另外两道拱肋半径为 642 px 与 604 px。圆的上半周加上端点向下的垂线形成拱门,圆心到三个头部的竖向关系成为主轴。三人围绕 x=1500 的轴线排开,最高头部约为 y=1080,鞋底约为 y=1740,最高人物高度约 660 px,小于短边 2000 px 的 35%(700 px)。

三道外拱、黄色套印细弧、向上回响场、左侧竖排标题及右下微注释都从该圆、圆心或其切线关系定位;没有把圆、圆心、轴线或网格作为辅助线画出来。

配色

角色色值来自照片的部分与选择理由
纸色#F4F1E8石材受柔和日光照亮的暖白感;保持清亮的纸面。
深色#243437阴影中的石刻、拱内暗部、深色头发和外套;作为结构骨架与文字色。
朱橙#CA543C中间参观者的橙红羽绒服;是照片中最明确的视觉锚点。
浅赭黄#E0BE46左侧参观者的浅黄外套;与朱橙组成克制而有精神的暖色关系。

只有三种墨色。衣物上的浅线、断墨和磨损处露出的是背景纸色,不是第四种墨。

动势场

动势场取自三个人共同向上观看碑刻的注意力方向,选择的唯一运动逻辑是“从三人上方缓慢向上扩散的回响”。它由点、短断弧和极短线构成,起点在 (1500, 1120) 附近,半径由 45 px 延展到约 765 px;越远越稀疏,且只分布在人物上方。弧段与主拱同心,颜色只用深色和浅赭黄。没有使用朱橙色轨迹,避免从人体拖出的颜色产生不适联想。

配文

  • 中文标题:静听石上回声
  • 英文对应:LISTENING FOR THE ECHO
  • 微型注释:memory becomes space、the quiet holds

中文标题在左侧外拱的切线外竖排;英文沿同一侧的斜切线旋转;两条微注释对齐人物下方的水平弦关系。它们说的是聆听、空间与安静,不直接说明“有人在看纪念碑”,因此不是画面说明。

不良联想自查

单独看成品的第一联想应是三位同行者站在一个开阔拱门下、共同留意某个安静对象;暖色衣物让画面有人的体温,深色拱门提供稳定感。为避免将纪念场所读成暴力或死亡叙事,我没有复制碑上的战争和姓名文字,没有画尖锐、下落或喷溅的红色形状;橙红只被限制为居中衣物的清晰色版,所有向外消散的点和线只向上,并主要使用黄、深色。

逐条自检

第 2 节限制
限制结果依据
1. 只能用代码作画✓draw_poster.py 用 Pillow 的多边形、椭圆、圆弧、直线和固定随机数生成全部内容。
2. 不用图像生成或预训练视觉模型✓未调用模型、API 或视觉模型。
3. 生成程序不读取照片✓程序没有打开 reference.jpg,只含手写坐标、色值和形状。
4. 不用外部图形素材✓无图片、图标、纹理或模板;只使用系统 Noto 字体。
5. 不用预装 skill、插件或旧项目代码✓源码从本目录新建。
6. 可复现✓所有随机数均由固定种子派生;连续两次运行得到相同 SHA-256:49b4a6b31907deb6ee6e139a0321eed86670de28b5688714945b94a8f47a31ef。
7. 一张平面海报✓poster.png 是无透明通道的 3000 × 2000 RGB 平面图,无样机、外框或拼图。
第 4.2 节规格
项结果依据
核心母题✓三人作为一个紧密的人群母题;唯一辅助建筑形为拱门。
几何框架✓三道同心拱肋与人物中轴决定全部位置,辅助构造线没有显示。
主体尺度✓最高人物约 660 px,高度小于 700 px 上限。
留白✓可见墨色面积估计约 6.7%,远低于画面的一半。
色版✓三种墨色各自以掩膜和正片叠底印入,含固定随机断墨、磨损孔和横向干刷;黄弧相对深色拱有微小错位。
配色✓一种纸色、一种深色、两种主题色,共三种墨色。
动势场✓只有一个向上消散的同心回响场,混合网点、断续弧线和稀疏颗粒。
手绘线✓只在外套绗缝、包带和右侧外套轮廓处使用短、断、轻重变化的笔触。
纸张✓固定种子的纤维、纸浆小斑和微粒覆盖整张背景。
文字✓有中文标题、英文对应、两条微注释;中文标题为竖排。
不良联想✓未采用血色拖痕、伤口形态、暴力物件或死亡语汇;暖色被约束为衣物。

实现摘要

生成器为 draw_poster.py,依赖 Python 3 和 Pillow 12.2.0。paper() 用固定种子画纸纤维和纸浆斑;add_ink() 先以正片叠底压入每个色版,再在掩膜内部打出固定的露白孔与干刷划痕。三人、拱门和回响场均是手写像素坐标和数学圆弧。服装识别线从色版掩膜中扣除,因而直接露纸。文字使用 /usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc 与 NotoSansCJK-Regular.ttc。

生成命令:

./run.sh

已知不足

人物已被有意压缩为剪影,因此原照片中左侧包袋的斑点和彼此相拥的细微关系只留下很弱的提示。拱门也被简化成圆形框架,不能表现原建筑尖拱与石雕的复杂层次;这是为了让大面积纸面和单一视觉中心保持成立。

19

GLM 5.3 Flash

GLM 5.3 Flash 生成的海报《石头记得》
点击海报放大 · ← → 翻看
我的主观评价

唯一一个配文被遮挡的模型。人物也是完全对称的造型。右侧人物脑袋上像长了个开关。动势场和背景碑文的交互有点凌乱。

海报配文
「石头记得」The stone remembers
故事
名字刻在石头上,正被一家人慢慢念起、轻轻升起。
↓ 完整文件包 ZIP · 6.1 MB ↓ 海报原图 PNG · 4.5 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/poster.py
模型自述报告REPORT.md

生成命令:./run.sh(即 python3 src/poster.py),输出本目录 poster.png(3000×2000,RGB,无透明通道)。程序是 src/poster.py,Python 3 + numpy 2.5.4 + Pillow 12.2.0,未安装任何新依赖;字体用系统自带 Noto Serif CJK SC Bold(/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc,index 2)。随机数全部来自固定种子 RandomState(20261016),同一台机器重复运行逐像素相同(已用两次运行的 sha256 比对验证)。

1. 读到的照片

竖直的石砌连拱廊(哥特式尖拱),拱壁上密密麻麻刻满一行行姓名,墙上还有十字、纹章和刻字诗句。一家三口背对镜头站在拱下读名字:左边是穿淡黄颜色羽绒服的母亲,中间父亲穿砖橙色羽绒服、牛仔裤,右边是穿藏青色连帽衫的孩子,三人个子相差不大,脚穿深色运动鞋。三张脸都仰起,视线投向头顶上方那片刻名的墙面。他们身前有一道上着黑色小柱的铁链,把他们和墙隔开一点距离。天气阴沉,整体是冷灰的石头色,画面里最鲜活的颜色只有两个人身上的橙和黄。

我的解读取最平常的那种:这是一个战争纪念性场所(墙上可见 "…GLORIOUS DEAD…"、"THEY WERE YOUNG…" 一类刻字),可能是一家人在天冷的日子里来读阵亡者的名字——他们在替不那么鲜活的名字保持鲜活。没有判断出更有戏剧性的情节,也不想编。

2. 故事

名字刻在石头上,正被一家人慢慢念起、轻轻升起。

3. 取舍

保留:

  • 一家三口背影(核心母题)——橙、黄两件羽绒服是照片里唯一鲜活的颜色,是"活人"与"名字"关系的直接载体。三人并立、仰头,姿态不变。
  • 一座尖拱(辅助形 1)——纪念结构的骨架。拱洞的弧线天然构成几何框架。
  • 成行的刻名痕迹(辅助形 2)——用断续的浅色短横划暗示刻满墙壁的名字,不写成真实文字。
  • 前景铁链(辅助形 3)——照片里隔开人与墙的链子,是"观者与逝者之间那道线"的叙事符号,也是唯一用短促手绘笔触处理的识别细节。

删除:另外两座拱和右缘拱的一部分(只留一座,免分散)、拱内雕花藻井与纹章(通俗装饰、且会变成细节堆砌)、地面铺装与全部环境(让纸承担空气)、母亲的围巾花纹 logo、鞋带鞋标等一切小装饰。

4. 几何框架

纸面尺寸 3000×2000(横向,随照片方向)。

  • 圆/弧:两心式尖拱。拱脚位于 (1050, 1180) 与 (2350, 1180),左半拱是以右拱脚为圆心、半径 1240–1338 的圆弧段,右半对称;两弧在顶点 (1700, 54) 相交成哥特式的尖。同一对圆心在半径 1178–1196 生成一条细细的同心内环,作为重复比例的回声。
  • 轴线:拱的竖直对称轴 x = 1700;拱脚水平线 y = 1180;人物脚线(地面)y = 1560。
  • 对齐关系:
    • 三人组的几何重心落在拱轴 x=1700 上(父 1690 / 母 1548 / 子 1860 的合力中心≈1700),脚全部踩在 y=1560 的直线上,两根拱柱底也落在同一条线上;
    • 微型注释两条都居中在 x=1700(拱轴正下方);
    • 标题列与英文字列底边同在 y=1394,恰好停在链条挂点高度(y≈1408)之上,被链"托"住;
    • 链条挂在两端小柱与两根拱柱各一点(y=1408),其中段悬链的垂度让链在人物膝盖高度横过画面,与拱弧同为连续曲线族;
    • 动势场的边界由拱腔内部 mask(两个 1240 半径圆的"透镜"内部)收束,密度横向上也向拱轴衰减到零;
    • 刻名行的两端 x 范围取自拱腔在该高度的实际内缘。
  • 所有顺位由这些数字推出;辅助线、圆心、十字一概没有画出来。

5. 配色

版色值来自照片的哪里理由
纸#F1F0EA右拱腔、右拱上部墙(取样 #AFACB3、#7C7B7B 提亮)照片是阴天的冷调石墙,按其冷色温取明亮的冷米白
深色#23272F链条(#151E20)与孩子的藏青帽衫全图骨架:拱带、柱、链、孩子、文字、发与鞋都是这一版
橙#C44F29父亲羽绒服(中位 #AC4F41),略微提纯唯一的暖色焦点,集中在父亲身上
黄#D8B958母亲羽绒服(亮面 #E6E3D6、暗面 #9F9E7B 收敛)与橙作小面积对话,只出现在母亲身上

共三种墨色(深色另有淡版,用于刻名、动势场与父亲的牛仔裤),不超过四种。

6. 动势场

转化的对象是照片里的视线的方向——三张仰起的脸崇拜式望向的那片名字墙,以及名字"被念出来"这件事。运动逻辑只选一种:上升。从三人头顶、沿拱轴,细碎的竖划与小点向上升起,越上越疏、越碎越长距,在 y≈238 处密度归零,消失在留白里;横向也向两侧衰减。它的左右边界由 Section 4 的拱腔 mask 收束——贴近拱带的内缘是空的,靠近拱轴最密。刻意保持在"灰"里:与橙、黄完全不接触,避免任何"从身体里冒出东西"的联想。

7. 配文

  • 标题:「石头记得」/ THE STONE REMEMBERS。中文竖排于左缘(列轴 x=300,底端 y=1394,字号 118),英文 27px、字母距 11px,顺时针旋转 90°成书脊式竖排,与中文列同底、轴 x=415。
  • 微型注释:「风在替谁念名字」/ FOR WHOM THE WIND READS,横排在拱轴正下方(x=1700,y=1622 / 1688),33px / 15px,手动字距。

放这里而不是别处:标题占最小的左缘竖列维持重量平衡;注释在拱轴的延长线上,是"轴线走到头"的那一记。自查:两句都不是对画面的说明(画面里没有石头在"记得",也没有谁真的在念),说的是挽留与口信;若某天读起来像在描述"墙上刻了名字、有人在看",会重写。

8. 不良联想自查

单独看成品第一眼的联想顺序:"墓园/纪念地 → 三个人站墙前 → 有人名字 → 平静"。纪念性本身是主题给的,不是事故。具体排查过的点:

  • 升起的灰点曾经更密、更长,孤立看有一小段像黑烟/裂纹。已把长轨迹从 7 条减到 4 条、长度和浓度都调低,并保证它们不与人物接触、全部在半空淡出。
  • 橙色只出现在父亲的完整大色块里,没有飞溅状碎点,链条也不把任何颜色引向身体。
  • 孩子背上的白色虚线(照片里确有的一道浅色缝线)刻意做成规则短虚线,不连续、不成缝状。
  • 链条是唯一贴地横过画面的深色线,它与三个人是"隔挡"关系,指向清楚。

9. 逐条自检

第 2 节的七条硬性限制:

  1. 只能用代码作画 —— ✓ 全部形状/肌理由 src/poster.py 里的坐标、解析函数与噪声生成。
  2. 不用图像生成模型 —— ✓ 未调用任何模型、API 或网络服务,全程离线。
  3. 生成程序不读取照片 —— ✓ poster.py 没有任何打开 reference.jpg 的代码;观察、放大与取色用的一次性脚本不在生成程序里,观察结果只以手写数字(坐标、色值)留在 src/poster.py 第 30–35 行的注释里。
  4. 不用外部图形素材 —— ✓ 无剪贴画、SVG 库、笔刷、纹理贴图;仅引用系统字体 Noto Serif CJK SC Bold。
  5. 不用预装 skill / 插件 / 以前项目 —— ✓ 从空目录手写,未调用任何 skill。
  6. 结果可复现 —— ✓ 固定种子,全部经 np.random.RandomState;两次运行 sha256 逐一一致(见下)。
  7. 一张平面海报 —— ✓ 单张 3000×2000,无透明通道,无相框/阴影/外框/拼图/水印。

4.2 表格:

项状态依据
核心母题✓一个:一家三口的背影;辅助形三个:拱、刻名行、链,各有明确叙事意义
几何框架✓两心圆弧尖拱(R 1240/1178 两阶)+ 竖轴 x=1700 + 水平拱脚线/脚线;所有图形、文字、动势场都由这些线推导;画面上没有画出任何辅助线
主体尺度✓父亲从发顶到鞋底约 472px ≈ 短边 2000 的 23.6%,其余更矮
留白✓程序内测量:与纸色差 <24(RGB 和) 的像素占 90.5% ≥ 50%
色版✓三块实版 + 一次淡版;每块经 plate_texture(低频墨色不均 + 磨损 + 露白针孔 + 干笔横纹),edge_keep 6–8px 边缘不磨损(锐利);正片叠底逐版叠印,橙版整体偏移 (+3,+2) 做套印错位
配色✓纸 1 + 深 1 + 主题橙/黄 2 = 3 种墨色 ≤ 4(淡深色不另算)
动势场✓恰一个,唯一"上升"逻辑;短竖划+短板+少量断线;密度随高度衰减至 y≈238 归零
手绘线✓只有前景铁链(短促、轻重不一、抖动、偶断开的短笔触 + 环扣小竖记);其余图形都是解析形
纸张✓低频斑驳(每通道错相)+ 约 4200 根短纤维 + 像素颗粒
文字✓中文标题一句 + 英文对应 + 一条双语微型注释;竖排中文与旋转 90° 的英文;只有配文(无时间/地点/署名/水印)
不良联想✓见第 8 节的自查与调整

10. 实现摘要

src/poster.py,Python 3,numpy + Pillow。分六步(可复现):

  • 纸:随机小格图 (vnoise) 两频叠加做低频斑驳(每通道相位略错开避免死板灰),4200 根随机短线做纤维,再加逐像素细粒(±1.2)。
  • 色版肌理 plate_texture:mask 先 MinFilter 腐蚀出内部与 6–8px 的"锐边环",内部叠低频墨色不均、中频磨损斑、细密各向异性"干笔纹"和高频薄过阈值的露白针孔;输出 = 边环本色 + 内部纹理,保证边界 crisp。
  • 人物/拱/柱:全部为解析函数(椭圆、胶囊、逐行轮廓 blob_mask、拱带用 |dist−r| 带状 mask 加 3–4px AA),坐标都是手写常量;拱带与拱柱开口同一套圆心半径。
  • 刻名行:2× 超采样 overlay 画断续短横划,行距 46px、明度随高度衰减、随距离有粗细与跳断差异;两端 x 按拱腔内缘收口。
  • 动势场:拒绝采样法生成 ~1250 个竖向小划(含分段断裂)+ 4 条波动断续长轨迹,横纵密度都受 opening mask 与拱轴两种衰减控制;画在 2× overlay 后 LANCZOS 降采样。
  • 链 + 文字:铁链以 6px 步长的抖动短笔触 + 随机环扣竖记画在 2× overlay;文字用 Noto Serif CJK SC Bold,标题/英文竖排与河县注释都以 2× 或 3× 超采样栅格化后并入同一深色版;鞋底与孩子背缝线以 cut mask 从深色版中挖掉露纸。
  • 叠印导出:apply_ink 用 /255 归一的正片叠底逐版乘上纸面,橙版在合并前按 (+3,+2) 平移做套印错位,最后裁剪空部统计留白并导出 PNG。

依赖:numpy、Pillow(无需安装新包);字体:Noto Serif CJK SC Bold(系统已装)。生成命令:./run.sh。

11. 已知不足

  1. 人物剪影仍偏"图标化":羽绒服的蓬松度和横向压线只以肌理近似,细看不如照片里那样"厚"。
  2. 刻名行是抽象化的短划,近看不成真实文字(有意为之,但代价是站远一点看不出那行是什么字)。
  3. 链条的悬链弧线把照片里高低不一的挂点改成等高的统一挂点,透视和挂点与原物不完全一致。
  4. 动势场刻意的克制让它在小尺寸预览时可能被当成纸面噪点,"上升"这层意思需要一会儿才读得出来。
  5. 拱带上的大块斑驳在缩略图观看时略抢眼;再收一档磨损强度会更"平版"。
  6. 母亲领口的形状近看略像“戴了兜帽”,与照片里帽兜垂在背后的状态有一点出入。
  7. 记号"记"字的竖排间距可再紧半格,标题列与右缘的英文列距离略宽。
20

Kimi 3

Kimi 3 生成的海报《把名字读亮》
点击海报放大 · ← → 翻看
我的主观评价

三个人的身形明显臃肿,不成比例。这个模型比 Kimi 3.1 Pro 更慢,只有 5 tok/s。不知官方是否做了某种针对性限速,否则这两款模型的慢法实在到了难以投入实用的地步。

海报配文
「把名字读亮」Reading names into light
故事
三个人把刻在石上的名字,重新读成有温度的光。
↓ 完整文件包 ZIP · 8.2 MB ↓ 海报原图 PNG · 6.5 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/generate_poster.py
模型自述报告REPORT.md

生成命令:./run.sh(等价于 python3 src/generate_poster.py)。输出为 poster.png,RGB PNG,3000 × 2000。

1. 读到的照片

事实:横向照片。石砌纪念墙前有三个背对镜头的人,站得很近,像在共同读墙面上的名字。中间成人穿橙红色羽绒服,灰/深色头发,戴细眼镜;左侧的人穿浅黄绿色外套,黑发;右侧较矮的人穿深色外套,浅发或浅色兜帽边缘。三人都微微仰头,视线落在刻满名字的墙面上。场景是哥特式尖拱、石柱、扇形拱顶和黑色铁链围出的纪念空间,气氛安静、克制,像校园或教堂中的战争纪念墙。

解读(取最平常的一种):他们不是游客式围观,而更像一家人或同行者,在名单前停住,用身体彼此支撑;链条把他们和墙隔开一小段距离,形成“在场但不可触碰”的关系。可识别细节是橙红羽绒服、浅黄外套、深色小个子身影、眼镜、兜帽、鞋和铁链;建筑上最强烈的是尖拱与密布的刻名。

2. 故事

三个人把刻在石上的名字,重新读成有温度的光。

3. 取舍

保留:三个背影组成的一个核心母题;尖拱纪念墙的几何秩序;低处的铁链;橙红与浅黄两件外套作为照片里最鲜活的色彩;仰头读名带来的向上动势。

删掉:繁复石雕、扇形拱顶细节、全部铭文、石墙砖缝、地面铺装、建筑纵深与游客环境。原因是它们会制造多个视觉焦点和“完整复刻照片”的背景感;海报只保留能认出原物、又能说明关系的少数形态。

辅助形三个,均有叙事意义:淡色尖拱墙版=纪念墙/被阅读的对象;低铁链=距离与守护;向上稀疏轨迹=视线与默念的升起。

4. 几何框架

不可见框架由尖拱推出:左、右拱脚取 (600,1500) 与 (1600,1500),两圆半径 R=1000,圆心距等于半径,交得尖拱顶点 (1100,634);中轴为 x=1100。核心人物簇以该轴为中心,脚底落在 y≈1690,最高处约 y≈1118,高度约 600 px,低于短边 35%(700 px)。淡色尖拱墙版由同两条弧直接生成;铁链挂在拱脚高度附近并略下垂;动势场被同一尖拱边界裁剪,从人物头部附近向上、向顶点方向衰减;竖排中文标题放在拱版右侧边外,英文标题落在人物脚下的水平轴线上,微注释沿右侧留白边排列。辅助线、圆心、网格、标记点均未画出。

5. 配色

  • 纸色:#F5F0E5,明亮暖象牙白,对应照片里灰白石墙被纸面提亮后的色温;避免发黄做旧。
  • 深色:#1F272C,深石板蓝黑,来自石柱阴影、深色外套、头发和铁链,用来构成骨架与文字。
  • 主题色 1:#B55B42,来自中间橙红羽绒服,压暗并去荧光,保留“人群中的暖”。
  • 主题色 2:#D8CB8B,来自左侧浅黄绿外套,作为少量相邻暖版。
  • 淡版:尖拱墙不是第五种墨,而是深石板色 #1F272C 的低强度淡版,通过很低不透明度的正片叠底得到。

全图墨色控制为纸色 + 深色 + 橙红 + 浅黄四种;浅灰拱版归为深色淡版。

6. 动势场

转化的是照片里三人共同的仰头、读名与安静视线:不是物理动作,而是从身体向墙面、向尖拱顶点上升的心理方向。只选一种运动逻辑:从核心人物头部附近升起,向上向内朝不可见拱顶收束,密度随离核心距离指数衰减到零。粒子由短促断线、细轨迹和粗糙网点组成,颜色只用深石板灰,不用橙红,避免从身体拖出暖色痕迹。边界由第 4 节同一尖拱的两条弧决定,不另起方向。

7. 配文

  • 中文标题:把名字读亮;竖排在尖拱右侧边外,参与拱的垂直秩序。
  • 英文对应:READING NAMES INTO LIGHT;小字、加宽字距,放在人物脚下水平轴线上。
  • 微注释 1:光从低声处升起 / LIGHT RISES FROM A LOWERED VOICE,在右下留白边,和铁链的轻下垂线保持同一高度带。

自查:这些句子写的是情绪与隐喻,不直接说明“三个人站在墙前”这类画面内容;没有日期、地点、风格名、署名或水印。

8. 不良联想自查

单独看整图,第一眼可能的联想是:纪念、名单、沉默、陪伴;风险点是橙红色块若拖尾会被读成血迹,深色圆头若过大会有卡通或符号化问题。处理:动势场只用深灰并从头顶上方稀疏升起,不让橙红向外喷溅;人物没有红色液体状边缘;铁链保持细、低、断墨,不构成束缚身体的暴力感;头部缩小并压进肩部,减少“球”感。整图无伤口、暴力、死亡场景的直接描绘。

9. 逐条自检

第 2 节限制:

限制✓/✗依据
只能代码作画✓src/generate_poster.py 全部图形由坐标、弧线、多边形、噪声和固定随机数生成。
不用图像生成模型✓未调用任何文生图/图生图/API/预训练视觉模型。
生成程序不读照片✓生成脚本只有手写常量;grep 检查无 Image.open 读照片逻辑,仅注释提到不读取 reference.jpg。
不用外部图形素材✓无剪贴画、图标、笔刷、纹理贴图、模板;只用本机 Noto CJK 字体。
不用预装 skill/旧项目✓未调用海报/photo-poster 类 skill,从空目录写脚本。
可复现✓SEED=20261026;连续两次生成 poster.png 的 SHA-256 相同。
一张平面海报✓单张 PNG,纸色到边,无样机、边框、拼图或多张输出。

4.2 规格:

项✓/✗依据
核心母题一个,辅助形≤3✓核心为三人背影簇;辅助为尖拱墙版、铁链、向上动势场。
几何框架含圆/弧和轴线,不画辅助线✓两圆尖拱 + x=1100 中轴;只用于定位,未显式绘制。
主体高度≤短边35%✓人物簇约 600 px < 700 px。
留白≥50%✓以纸色距离阈值估算,明显墨迹面积约 16%,纸面留白约 84%。
色版断墨/磨损/露白/干笔,边缘清晰,正片叠底,1–4px错位✓每色一版 mask + 洞孔/斑块/干笔 streak;ImageChops.multiply;偏移 (-2,1)、(2,-1)、(1,2)。
配色≤四种墨色✓纸、深石板、橙红、浅黄;浅灰拱为深色淡版。
动势场恰好一个,密度衰减到零✓只有“上升/向拱顶收束”一种逻辑;指数衰减并受尖拱边界裁剪。
手绘线只用于识别细节✓眼镜、兜帽/衣缝、鞋边、右侧浅发、铁链端部;短促、抖动、断开。
纸张程序生成纤维斑驳颗粒✓低频斑驳、细 grain、随机纤维线,非纯色。
文字:中标题+英文+1–2条微注释,至少一处竖排/非水平✓竖排中文标题;英文标题与两条微注释;只有配文本身。
不良联想✓见第 8 节;避免红橙轨迹贴身的血/伤联想。

10. 实现摘要

纸张:用 NumPy 固定种子生成低频斑驳与细颗粒,再用 Pillow 画随机短纤维;整体保持明亮暖白。色版:每种颜色先画锐利 mask,再用随机洞孔、模糊斑块阈值和水平干笔 streak 做断墨,最后以 multiply 叠到纸面,并给每版 1–4 px 的确定性套印错位。动势场:从核心头部附近按 Beta 分布取样距离,向上角度生成短线/网点,透明度指数衰减,并用尖拱半宽公式裁剪。手绘线:分段抖动线,随机改变线宽、留断口。文字:Noto Sans CJK,竖排中文逐字堆叠,英文用 textlength 加字距。依赖:Python 3、Pillow、NumPy;系统 Noto Sans CJK 字体。生成:./run.sh。

11. 已知不足

人物被压成很简的色版后,仍有一点图标化;右侧深色人物的浅发只能靠几笔暗示,远观较弱;动势场在头部上方略集中,若再放疏一些会更安静;淡色尖拱墙在部分显示器上可能过于接近纸色。整体选择保留这种克制,以避免回到写实插画或复杂背景。

21

Opus 4.6

Opus 4.6 生成的海报《余温》
点击海报放大 · ← → 翻看
我的主观评价

画面几乎辨认不出三人的身形,整体色块与走势活像一只烧红的电熨斗。这也是实测表现与我心理预期落差最大的一款模型。

海报配文
「余温」What remains is warm
故事
石拱下三个人贴在一起,他们之间的温度比周围的石头更持久。
↓ 完整文件包 ZIP · 9.6 MB ↓ 海报原图 PNG · 7.9 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/generate_poster.py
模型自述报告REPORT.md

1. 读到的照片

水平构图,3000 × 2000 像素。三个人并排站在哥特式尖拱纪念建筑前,身体挨得很近,像在取暖或合影。中间那个人穿橙色羽绒服,个子最高,站得最直;左边的人穿浅黄色外套,身体略向中间倾斜;右边的人穿深色衣服,也微微靠向中间。三人脚下有一条链条或栏杆横过。背景是石质拱门,尖顶哥特式造型,灰色调。整张照片色温偏冷,非常去饱和,只有中间人物的橙色外套是唯一鲜明的色块。

解读:三个关系亲近的人在一座纪念性建筑前合影或驻足。场景安静,没有明显的仪式感或戏剧性,只是日常中的一个停留瞬间。

2. 故事

石拱下三个人贴在一起,他们之间的温度比周围的石头更持久。

3. 取舍

保留:

  • 三人并排的剪影——这是照片最核心的视觉母题,体现"在一起"的关系
  • 哥特式尖拱——定义了空间和几何框架,也是照片中最具辨识度的建筑元素
  • 橙色——从中间人物的羽绒服提取,是整张照片唯一的暖色、唯一的生机
  • 脚下的链条——一个让人认出场景的识别细节
  • 人物的大致比例差异(中间最高、右边最矮)

删掉:

  • 所有背景建筑细节(石材纹理、柱子、拱门细节)——只保留一个抽象化的拱形
  • 面部特征——用剪影代替,符合木刻拓印的语言
  • 衣服的具体褶皱、口袋等——只保留轮廓和色块
  • 地面、天空、周围环境——用留白替代,表达距离和心理空间

理由: 照片的核心不是建筑本身,而是三个人在冷色背景中靠在一起的那种温暖感。一个拱形足以传达场所,三个剪影足以传达关系,一种橙色足以传达温度。

4. 几何框架

整个构图建立在一个哥特式尖拱(lancet arch)之上:

  • 垂直轴线:x = 1050,由三人群体的重心决定
  • 拱的参数:顶点 y = 520,底边 y = 1560,底边半宽 = 410
  • 弧线生成:用两段圆弧构成。以底边端点为起点,弧心位于底边高度(y = 1560),半径 R 和弧心水平偏移 u 由以下几何关系求得:

    h = base_y - apex_y = 1040
    u = (h² - base_hw²) / (2 × base_hw) ≈ 1113
    R = u + base_hw ≈ 1523

    左弧中心在 (2163, 1560),右弧中心在 (-63, 1560),两弧在 (1050, 520) 相交形成尖顶。弧线在底部完全垂直,向上逐渐弯曲收拢。

  • 元素对齐:
    • 三个人物中心对齐到垂直轴 x = 1050,左右人物各偏移 ±70
    • 链条沿拱底方向水平展开,y = 1420
    • 动势场(上升粒子)以垂直轴为中心分布,受拱形边界约束
    • 文字 "余温" 沿垂直轴右侧排列(x = 1470),与拱的右侧弧线形成几何呼应
    • 英文注释对齐到中文标题下方

辅助线、圆心和网格均不绘出。

5. 配色

角色色值 (RGB)来源选择理由
纸色(238, 235, 230)照片整体偏冷灰的天空/背景微偏暖的象牙白,不发黄不发旧,明亮清爽
深色(35, 33, 30)照片中石材建筑的最深阴影区域接近纯黑但带微暖,用于视觉骨架:剪影、文字、细线
主题色(橙)(200, 88, 52)中间人物的橙色羽绒服照片中唯一的鲜明暖色,代表人的温度和生命力;与冷纸色对比鲜明

色彩数量:纸色 1 + 墨色 2(深色、橙色),共 3 种,不超过 4 种上限。

正片叠底混合后的实际色值:

  • 纸 × 橙 / 255 ≈ (187, 81, 47) — 温暖的印刷橙色
  • 纸 × 橙 × 深 / 255² ≈ (26, 10, 5) — 极深的重叠区

6. 动势场

转化的运动: 照片中三个人在寒冷环境中靠在一起,体温、呼吸向上散发——转化为"上升"的运动逻辑。

实现: 从三人群体上方生成粒子,以高斯分布为中心(均值在 x = 1050),向上扩散。粒子形态混合使用:

  • 小圆点(半径 1–2 px):占 48%
  • 短竖线(5–18 px):占 28%,方向接近垂直,有轻微随机偏转
  • 单像素点:占 24%

密度衰减:靠近人物头顶最密,随距离指数衰减(exp(-d/300)),同时有水平方向的高斯衰减(σ = 140),向外逐渐稀疏、破碎,最终消失在留白里。

边界: 受拱形几何框架约束——粒子不超出拱顶(y < apex_y - 40 时丢弃),不超出拱的水平范围(|x - cx| > 360 时丢弃)。

7. 配文

文本位置方向
余温x = 1470, y = 630 起竖排,大号宋体 76pt
What remains is warm(1420, 905)横排,无衬线 19pt
不散 · Together, still(1420, 940)横排,无衬线 15pt

"余温" = 散去之前的余热——这是一个隐喻,不是在描述画面上有什么。它暗示人与人之间留下的温度正在消散,但还没有完全消失。

"What remains is warm" = 英文对应,不是直译而是等值转换:留下来的是暖的。

"不散 · Together, still" = 微型注释。"不散"呼应"余温",表达一种安静的愿望——还在一起,尚未散去。

自查: 这些文字都在描写情绪和隐喻(温度、聚散),没有描述画面本身(没有说"三个人站在拱门下"之类)。

位置逻辑: 文字沿拱的右侧外缘排列,与拱形的垂直轴平行。竖排的"余温"与拱的纵向走势呼应,参与几何秩序而非独立贴上。

8. 不良联想自查

生成后单独审视整图:

  1. 火焰联想:橙色尖拱形状可能被解读为火焰。缓解措施:(a) 拱形有清晰的深色描边轮廓,读感为建筑而非自然现象;(b) 底部有水平基线,形成"门"的结构感;(c) 橙色是沉稳的赭橙,不是明亮的火焰红橙。
  2. 血迹联想:上升的粒子贴着人物身体。缓解措施:(a) 粒子是深色(在深色版上),不是红色/橙色;(b) 运动方向向上,不是从人物身上流出;(c) 粒子形态为离散的点和短线,不是液体流动感。
  3. 墓碑/墓地联想:哥特式拱门加上人物剪影。缓解措施:(a) 暖色调传达温暖而非悲伤;(b) 人物姿态是靠在一起而非哀悼;(c) 标题"余温"传达温情而非丧葬。
  4. 刀刃/武器联想:曾在 v1 版本出现(拱过窄像刀刃),已通过加宽拱底(410 px 半宽)和使用圆弧(而非尖锐贝塞尔曲线)修正。

结论:当前版本的第一读感应为"三个人在一个温暖的拱门里",未发现不可接受的不良联想。

9. 逐条自检

§2 硬性限制
#限制状态依据
1只用代码作画✓所有图形由 Python + Pillow + NumPy 的坐标、几何和数学公式生成
2不用图像生成模型✓未调用任何 AI 模型、API 或预训练视觉模型
3生成程序不读照片✓generate_poster.py 不含任何打开/读取 reference.jpg 的代码;所有视觉数据以手写常量存在
4不用外部图形素材✓唯一外部资源为系统安装的字体(Noto Serif CJK, DejaVu Sans)
5不用预装 skill/模板✓从空目录开始编写
6结果可复现✓固定种子 SEED=42,所有 RandomState 均从固定种子派生;重复运行输出相同
7一张平面海报✓单张 3000×2000 PNG,纸色铺到四边,无样机/边框/拼图
§4.2 可核对规格
项状态依据
核心母题✓一个:拱门内三人剪影。辅助形:链条(场景识别)、动势粒子(温度隐喻),共 2 个
几何框架✓哥特式尖拱(两段圆弧 + 垂直轴线),所有元素位置由此推出;无辅助线/圆心/网格绘出
主体尺度✓最高人物 310 px / 短边 2000 px = 15.5%,远低于 35% 上限
留白✓拱形面积约 57 万 px²,总面积 600 万 px²;纯纸面积约 90%,远超 50%
色版✓橙色版和深色版各一,内部有墨色不均、磨损斑、露白、干笔纹;边缘由几何定义,清晰锐利;正片叠底合成,套印错位 (3, -1) px
配色✓纸色 + 深色 + 橙色 = 3 种墨色,不超过 4 种
动势场✓一个,上升逻辑;由散点、短线、单点组成;密度随距离衰减至零
手绘线✓用于领口、肩缝、外套边缘、鞋痕、手臂轮廓、链条——均为识别细节;短促笔触、抖动、偶有断开
纸张✓程序生成:横向纤维(box blur)、纵向纤维、高斯噪声、随机深色斑点、低频色温偏移
文字✓中文标题"余温"(竖排)+ 英文 "What remains is warm" + 微注"不散 · Together, still";只有配文,无时间/地点/署名
不良联想✓见第 8 节,已逐项检查和缓解

10. 实现摘要

语言与库: Python 3 + Pillow (PIL) + NumPy

字体: Noto Serif CJK Bold(中文标题)、Noto Sans CJK Regular(中文注释)、DejaVu Sans(英文),均为系统预装

纸张纹理:

  • 基底:均匀纸色 + 高斯噪声 (σ=2)
  • 横向纤维:行方向 box blur(k=60)的正态随机场,RGB 分量不同权重
  • 纵向纤维:列方向 box blur(k=40)的正态随机场
  • 斑点:0.05% 的像素随机压暗
  • 色温偏移:6 个大半径低频圆形区域,微调 RGB

色版肌理(plate_texture):

  • 低频墨色不均:小尺寸正态随机场 → 双线性插值放大
  • 磨损斑:随机圆形区域内 alpha 衰减(半径 1–6 px,数量按面积比例)
  • 细粒脱落:1.8% 像素随机 dropout
  • 方向性纹路:逐行微调 alpha(正态分布 σ=0.05)

正片叠底: result = base × ink / 255,通过 alpha 权重混合:out = base × (1-a) + (base × ink / 255) × a

套印错位: 橙色版整体偏移 (dx=3, dy=-1) 像素

哥特式尖拱: 两段圆弧,弧心在底边延长线上,半径由底宽和拱高的几何关系求得,确保底部严格垂直

人物剪影: 参数化几何体(头部椭圆 + 颈部矩形 + 梯形躯干 + 肩部椭圆 + 矩形腿),中心人物的躯干绘在橙色版(使橙色透出)、头部和腿绘在深色版

动势场: 3000 次高斯采样,以人物重心为中心,向上偏移;经密度衰减和水平衰减过滤后,以散点、短线、单点三种形态绘制

手绘线(_hand_curve): 输入控制点 → 沿线段细密插值 → 每个采样点加正态抖动 (σ=0.6) → 4% 概率断开 → 线宽随正态分布微调

链条: 悬链线(二次近似),用 _hand_curve 绘制主线,沿线间隔绘制链环(短弧线段)

生成命令:

bash run.sh

即 python3 src/generate_poster.py,输出 poster.png 到项目根目录。

依赖安装:

pip install pillow numpy --break-system-packages

(在 PEP 668 系统上需要 --break-system-packages 标志)

11. 已知不足

  1. 人物剪影过于简化:三个人物仅用头/颈/躯干/腿的基本几何体表示,缺乏胳膊轮廓、衣服褶皱等能增强可辨识度的细节。手绘线补充了一些(领口、肩缝、鞋痕),但整体仍偏抽象。
  2. 拱形与典型哥特尖拱比例略有差异:为避免过窄(v1 的刀刃问题),拱底较宽,导致整体更接近尖椭圆而非教科书上的细长尖拱。但作为设计元素而非建筑复刻,比例是合理的。
  3. 文字与几何秩序的整合可以更深入:文字放在拱右侧外缘,沿竖排方向与拱平行,但未与弧线相切或嵌套。更深度的排版整合(如沿弧线排列)可以增强几何秩序感。
  4. 中间人物的橙色外套:因为与橙色拱形同版,在拱内区域外套色与背景色相同,无法产生视觉区分。设计意图是让中间人物"融入温暖",但这牺牲了一些可辨识度。
  5. 动势场粒子密度:在小尺寸显示下粒子效果较好,但放大到 100% 查看时部分区域粒子偏稀疏。
  6. 链条细节:作为识别细节的链条在整图缩览时几乎不可见,需要放大才能辨认。
22

Gemini 3.1 Pro

Gemini 3.1 Pro 生成的海报《凝视的重量》
点击海报放大 · ← → 翻看
我的主观评价

看到成品的瞬间,嘴里要是含着水,真能当场喷出来。

海报配文
「凝视的重量」Weight of memory
故事
三个渺小的生命在巨大的历史纪念碑前驻足,他们的凝视与石刻的姓名之间产生了跨越时间的无声回音。
↓ 完整文件包 ZIP · 7.9 MB ↓ 海报原图 PNG · 6.2 MB 包内:REPORT.md · REQUIREMENTS.md · poster.png · reference.jpg · run.sh · src/generate.py
模型自述报告REPORT.md

1. 读到的照片

照片中,左侧是一位身穿黄色外套的人,中间是一位较高、穿着亮橙色羽绒服的人,右侧则是一位穿着深色外套、体型较小的人(疑似一家三口)。他们正隔着一条低矮的黑色铁链护栏,安静地站在一面巨大的哥特式石砌纪念墙前,视线统一向上方汇聚,凝视着墙面上密密麻麻的阵亡者姓名铭文。场景庄重、静谧,人物的背影与宏大的历史建筑形成了鲜明的尺度对比。能够辨认身份的细节包括中间人的眼镜、他们蓬松的外套以及地上的铁链。

2. 故事

三个渺小的生命在巨大的历史纪念碑前驻足,他们的凝视与石刻的姓名之间产生了跨越时间的无声回音。

3. 取舍

  • 保留:三个人的核心高低错落关系与轮廓、醒目的外套颜色(橙与黄)、微小但具叙事性的铁链护栏、中间人标志性的眼镜、以及他们共同向上的视线方向。
  • 删掉:墙面的真实石纹、具体的哥特式拱门结构、地砖图案和墙上的真实文字。
  • 原因:为了提炼出一个纯粹的视觉母题,将环境具象元素全部剥离,通过极致的留白和统一的动势场来表达“凝视”的心理空间,使画面从具象记录升华为象征着历史与当下对话的抽象图形。

4. 几何框架

  • 构图基准为画面底部的水平轴线(y = 1850)。
  • 动势场的几何结构基于一个圆心在人物头部 (x=950, y=1500) 的辐射极坐标系。所有视线的延长线均沿这个极坐标系的射线发射。
  • 排版轴线是一条垂直轴线(x=2000),将文字与右侧留白空间锁定,同时与动势场的最远端遥相呼应。

5. 配色

  • 纸色:暖象牙白(Warm Ivory,RGB 244, 241, 234)。提取自照片中纪念墙在漫反射光线下的浅色石材色温,用来提供一个明亮且具有空气感的背景。
  • 深色:深墨灰(Charcoal,RGB 44, 46, 42)。提取自照片中的黑色铁链和人物的深色裤子。作为画面的视觉骨架,用于最右侧人物剪影、排版文字和动势场,压住画面重心。
  • 主题色:亮橙色(RGB 222, 85, 30)和明黄色(RGB 230, 185, 40)。均提取自照片中人物鲜艳的外套,为画面提供生命力和视觉焦点。

6. 动势场

转化的是照片中三人向上仰望的视线与纪念墙带来的心理压迫感。

  • 运动逻辑:从人物头部(观察点)呈扇形向上方和右方辐射的散射场。由无数断续的、长短不一的干笔细线组成。
  • 边界与衰减:线场的密度和线条粗细随着离核心的距离增加呈指数级衰减,直至在巨大的留白中完全消散,隐喻视线或回音在时间中的扩散。

7. 配文

  • 中文标题:“凝视的重量”
  • 英文标题:“WEIGHT OF MEMORY”
  • 微型注释:“THREE FIGURES BEFORE THE WALL / RECORDED IN SILENCE”
  • 位置:放置在画面右侧的几何中轴线上,以竖排中文搭配横排英文的方式排布。文字恰好处于动势场辐射轨迹的末端,仿佛视线最终凝结成了这些字符,没有喧宾夺主,也没有描述画面内容,而是点出了凝视背后的隐喻。

8. 不良联想自查

  • 可能的联想:最初在构思动势场时,如果采用单一深色圆点从头部涌出,可能会让人联想到爆炸、血液飞溅或某种实质性的喷射物。
  • 调整:为了消除这种不适感,我将动势场改为了极细的、断续的放射状射线段,并拉长了它们之间的间距,使其看起来更像光线、视线或声波的抽象符号,确保画面保持静谧、克制的情绪,避免了暴力或危险的误读。

9. 逐条自检

限制/规格检查结果依据
只能用代码作画✓全部图形、颜色、肌理和位置均通过 Python、Pillow 和 Numpy 生成。
不能用图像生成模型✓未使用任何 AI 图像模型或预训练视觉模型,纯数学与逻辑作画。
生成程序不能读取照片✓generate.py 中没有 Image.open('reference.jpg') 的代码。
不用外部图形素材✓未引入任何 SVG、PNG素材,唯一外部资源为系统自带的 Noto 字体。
不用预装的 skill 等✓从空目录手写脚本完成。
结果可复现✓脚本开头使用 random.seed(42) 和 np.random.seed(42) 锁定随机数。
一张平面海报✓直接输出 3000x2000 的 poster.png,无样机边框。
核心母题与辅助形数量✓一个核心母题(三人剪影);极简辅助形(一条铁链)。
几何框架与标记线✓位置由隐形坐标系与圆心算得,代码中未绘制任何多余辅助线或十字。
主体尺度✓人物高度最高约 510 像素,低于短边(2000)的 35%(700像素)。
留白面积✓大面积区域完全未绘制任何线条和墨块,纯纸张面积远超 50%。
色版与正片叠底错位✓颜色分为深、橙、黄三版,应用正片叠底运算,带有随机生成内部损耗肌理与 1-2 像素错位。
配色数量✓纸色一种 + 深色一种 + 橙、黄两种主题色,共四种墨色。
动势场衰减✓使用单一散射运动逻辑,线条随半径增加概率变小、变细直至消失。
手绘线特征✓眼镜与铁链通过随机抖动、变宽与概率断开的算法模拟手绘效果。
纸张生成✓纸张底色上叠加了程序生成的单色颗粒噪声与低频斑驳肌理。
文字排布✓包含竖排中文与横排中英注释,内容为提炼的短句而非图解。
不良联想✓射线均匀清透,无任何引发不适或血腥暗示的元素。

10. 实现摘要

  • 环境:Python 3 + Numpy + Pillow。
  • 纸张:初始化 NumPy 全局矩阵,叠加高频灰度高斯噪声与降采样低频斑驳噪声。
  • 色版肌理:通过 np.random.normal 和阈值过滤生成布满随机磨损斑点和干笔刷痕的 Mask,与原始矢量抗锯齿 Shape 相乘。
  • 动势场:基于极坐标系,通过计算距离指数衰减概率来绘制射线段,模拟破损感和空气衰减感。
  • 手绘线:给线段坐标添加微小的 random.uniform 偏移,并通过概率判断跳过某些绘制以形成断线。
  • 文字:调用系统已安装的 /usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc 字体,利用 Pillow multiline_text 实现排版。
  • 生成命令:运行 ./run.sh。

11. 已知不足

动势场的线条分布在局部可能仍略显均匀,如果能加入更大尺度的块状缺失或者使用带有柏林噪声的遮罩进行整体擦除,会让丝网印刷或拓片的破旧感更加自然;目前的色版边缘虽然保持了清晰度,但在大块几何转折处的斑驳处理还可以更加细腻。

§ 05

原始材料

Materials
参考照片:哥特式拱廊下刻满名字的纪念墙前,一家三口站在铁链外仰头读墙
参考照片 · reference.jpg · 3000 × 2000 ↓ 原图 JPG · 1.6 MB
需求全文REQUIREMENTS.md

任务:用程序把一张照片画成一张风格海报

本目录里有两样东西:这份文档,和一张参考照片 reference.jpg。请按下面的要求,只用你自己写的程序,把这张照片重新画成一张海报,交付海报图片、源代码和一份说明。

整个过程没有人会回答你的问题。遇到不确定的地方,自己做判断,并把判断和理由写进说明里。

1. 交付物

全部放在本目录下:

文件内容
poster.png成品海报,尺寸见第 3 节
src/ 或任意源码文件生成海报的程序;语言、库不限(见第 2 节的限制)
run.sh(或 README.md 里一条命令)一条命令从头生成 poster.png,重复运行得到完全相同的图
REPORT.md说明,内容见第 5 节

2. 硬性限制:海报只能用程序画出来

违反任何一条,整个任务视为不合格。

  1. 只能用代码作画。 所有图形都是由你在代码里写下的坐标、曲线、几何关系和数学公式画出来的;所有肌理(纸张、颗粒、断墨、网点)都由程序里的噪声和随机数生成。你可以用任何通用语言和通用绘图库(如 Python + Pillow、HTML canvas、SVG + 光栅化、Cairo 等)。
  2. 不能用图像生成模型。 不调用任何文生图、图生图、图像编辑的模型、API 或网络服务;不用任何预训练的视觉模型(分割、抠图、边缘检测、风格迁移等)来处理照片。
  3. 生成程序不能读取照片。 最终生成 poster.png 的程序,不得打开、读取、采样 reference.jpg 的任何像素,也不得把照片描摹、滤镜化、矢量化或以任何方式嵌入成品。你观察照片、放大局部、量坐标、读颜色时可以用任何工具(包括自己写的辅助脚本),但观察的结果只能以你手写的数字(坐标、色值)进入生成程序。
  4. 不用外部图形素材。 不用剪贴画、图标库、SVG 图形库、笔刷图片、纹理贴图、现成的手绘风格渲染库或海报模板。唯一允许的外部资源是字体(本机已安装的,或从 Google Fonts 等公开来源下载的)。
  5. 不用预装的 skill、插件、以前的项目代码。 一切从这个空目录开始。如果你的环境里有名字类似"photo-poster"、"海报"之类的 skill 或模板,不要调用。
  6. 结果可复现。 随机数必须用固定种子;同一台机器上重复运行输出完全一样的 poster.png。
  7. 一张平面海报。 只有海报原稿本身,纸色铺到四边。不做样机(相框、墙面、阴影、透视)、不加外边框、不和原照片拼在一起、不出多张。

可用环境(以实际机器为准,必要时自行安装依赖并在 REPORT.md 里列出):Python 3 + Pillow,Node.js,无头 Chromium,系统已装 Noto Sans CJK / Noto Serif CJK 字体。

3. 尺寸与方向

海报是 2:3 的画幅(短边 : 长边 = 2 : 3),短边 2000 像素,长边 3000 像素。方向随照片:照片是横向的,海报就是横向(宽 3000 × 高 2000);照片是竖向的,海报就是竖向(宽 2000 × 高 3000)。导出 PNG,不带透明通道。

4. 风格说明

下面是这张海报要达到的风格。它是整个任务的作画依据,请完整读懂再动手。

4.1 风格原文

请把这张照片制作成一张独立的高级设计海报。海报从照片中提炼最具辨识度的主体、轮廓、姿态与叙事关系;在理解其核心内涵、人物关系或文化属性的基础上,将其重构为融合古籍拓片、丝网印刷图录与现代平面设计语言的图形构图。切勿逐一复刻照片中的所有元素,也不要添加通俗的传统纹样;仅保留一个核心视觉母题及极少数真正具有叙事意义的辅助形态。运用剪影、留白、局部放大、形态融合及符号化转换等手法,使图形既呼应原物,又能传达其内在意涵。

构图建立在严谨的几何框架之上:以主体自身的结构为基础,推出圆形、弧线、轴线或重复比例作为几何矩阵;随后通过相切、共轴、嵌套、镜像、比例递进或边缘裁切等关系,把所有主体形态、辅助图形、排版文字与留白空间对齐、整合。布局可以偏离中心、突破边界、不对称,但所有元素必须遵循同一套结构逻辑,远观时秩序一目了然。几何框架只用来决定位置和形状的边缘,辅助线、圆心、十字、网格、标记点本身一律不画出来,把秩序留给读者自己发现。

主体不填满画面:核心母题以较小的尺度置于大面积留白之中,留白不是空背景,而是画面的主要构成,用来表达空气、距离、时间与心理空间。只保留一个视觉中心。

图形是一块块平涂的色版:每种颜色是一版,内部有断墨、磨损斑、露白、干笔纹与不均匀的墨色,像木刻拓印或干笔丝网印刷;但每块色版的边缘保持清晰锐利,几何边界与重要轮廓精准,在粗犷的肌理与严谨的秩序之间形成对比。各版以正片叠底的方式叠印,允许轻微的套印错位;主体里本该是白的地方直接露出纸面。

在色版之外,把照片里原有的一种运动、方向、光线或视线关系转化为一个动势场:由细线、断续的轨迹、粗糙的网点和疏密变化的颗粒组成,靠近核心密集、强烈,向外逐渐稀疏、破碎,最终消失在留白里。动势场只选一种运动逻辑(坠落、上升、朝某方向流动、从一点辐射,或涟漪般的回响),不要同时堆叠多种效果;它和主体一起,由同一套几何框架决定方向和边界。

只在极少几处识别细节(帽檐、眼镜、鞋、链条、杆子这类让人认出原物的东西)使用手绘细线:由短促、反复、轻重不一的笔触组成,略有抖动与停顿,偶尔断开,像一份安静的手绘记录,不是光滑统一的描边。

配色:从照片中提取最具特色、最鲜活、最富精神内涵的颜色,重组为一套简洁克制的纸张印刷配色。以明亮、浅淡的纸色作背景(纸色按照片的色温在暖白、象牙白、冷米白之间选,保持明亮,不发黄发旧),用一种深色构建视觉骨架(剪影、头发、鞋、文字、最深的版),再用一到两种来自照片的主题色组织主体与少量点缀;次要区域可用同一颜色的淡版。纸本身要有纸的质感:细微的纤维、斑驳和颗粒,由程序生成。色彩要清爽、鲜活;避免浑浊的做旧感、刻板的传统民俗配色、荧光色、常规渐变和多色堆叠。

排版只作为构图的辅助信息存在。从照片的主题、人物的内心或一个安静的隐喻中提炼一句极短的标题,再配一两条微型注释,中英双语。文字沿几何轴线、留白边缘或图形边界排列,可以竖排、旋转、加大字距、与图形相切或嵌套,让排版参与几何秩序,而不是另外贴上去的一层;但不得喧宾夺主。文字写情绪和隐喻,不描述画面:如果一句话能直接当作画面说明,就重写。画面上只出现配文本身,不加时间、地点、标题栏、风格名、署名或水印。

整体视觉强调:一个核心母题、看不见的几何秩序、粗犷的拓印肌理与锐利的边缘、单一的动势场、辽阔的留白、克制的纸张配色、参与秩序的微型排版。成品应安静、克制、有余韵,像一本独立出版物或艺术展览的印刷品,与原照片保持清晰的视觉与概念对应:看过照片的人一眼能认出,没看过的人也能读出一个完整的瞬间。避免写实插画、完整复刻照片、复杂背景、多个视觉焦点、元素平均分布、装饰性堆砌、通俗传统纹样与印章、卡通感、3D 感、商业海报感与模板化排版。

4.2 可核对的规格

下表把原文里可以量化的部分写成硬指标,作画时对照检查。原文和表格冲突时以原文为准。

项要求
核心母题一个;辅助形不超过三个,每个都要能说出它的叙事意义
几何框架从主体结构推出,至少包含一个圆或弧和一条轴线;所有图形、文字、动势场的位置都从它推出;不画任何辅助线、圆心、网格、标记点
主体尺度核心母题中的人物(或等价主体)的高度不超过短边的 35%
留白没有任何墨迹、只有纸的面积不少于画面的 50%
色版每种颜色一版,内部有断墨、磨损、露白、干笔纹,边缘清晰;各版正片叠底叠印,允许 1–4 像素的套印错位
配色纸色一种 + 深色一种 + 照片主题色一到两种;同色淡版不另算;全图不超过四种墨色
动势场恰好一个,一种运动逻辑;由网点、断续细线、散点组成,密度随离核心的距离衰减到零
手绘线只用于识别细节;短笔触、轻重不一、略抖、偶有断开
纸张程序生成的纤维、斑驳、颗粒;不是纯色
文字中文标题一句 + 英文对应 + 一到两条微型注释;至少一处竖排中文或沿非水平方向排布的文字;只有配文本身
不良联想整图不得让人联想到血迹、伤口、暴力、死亡或其他不适、不雅的东西(见第 6 节)

5. 说明文件 REPORT.md 必须包含

  1. 读到的照片:主体是什么,有几个人、他们的关系、视线落在哪里、动作和姿态,场景是什么性质的地方,能认出身份的细节有哪些。这一节写你看到的事实和你对它们的解读,解读要取最平常的那种,不要编情节。
  2. 故事:一句话,这张海报讲什么。
  3. 取舍:保留什么、删掉什么、为什么。
  4. 几何框架:圆心在哪、半径等于什么、轴线从哪条结构推出来,各元素分别对齐到哪条关系上。
  5. 配色:纸色、深色、主题色的色值,各自来自照片的哪个部分,为什么选它们。
  6. 动势场:转化的是照片里的哪种运动或光线,选了哪种运动逻辑,边界由几何框架的哪部分决定。
  7. 配文:中英文原句,放在哪里,为什么放在那里;自查它是否在描述画面。
  8. 不良联想自查:单独看一遍整图后,写出你设想读者第一眼可能产生的联想,以及你为此做过的调整。
  9. 逐条自检:对第 2 节的 7 条限制和 4.2 的每一行,写 ✓ / ✗ 和一句依据;有 ✗ 要说明原因。
  10. 实现摘要:纸张、色版肌理、动势场、手绘线、文字各自怎么用代码实现,用了哪些库、字体;生成命令。
  11. 已知不足:自己看成品后觉得没做到位的地方。

6. 作画前后都要做的检查

  • 先放大看清照片再定故事:人的脸朝哪、看什么、手在做什么;人物关系取最平常的解读。
  • 定构思时就设想,成品出来后再单独看一遍整图:色块、颗粒、轨迹贴着人物身体时最容易被当成实物来读(例如从人身后拖出的一道红橙色颗粒会被看成血迹)。可能被误读就算不合格:换颜色、换动势方向,或重画。
  • 渲染出来要自己看图,裁局部放大看文字和线条的质量,反复修改,再交付。只交最后一版。

7. 建议的工作顺序

读照片 → 定故事和取舍 → 推几何框架 → 量坐标、取色(用你自己的辅助工具) → 写生成程序:纸 → 色版 → 动势场 → 手绘线 → 文字 → 叠印导出 → 看图、改、再看 → 写 REPORT.md。

顺序只是建议;限制和规格是硬性的。

↓ 下载 REQUIREMENTS.md · 12 KB