🌻 设计文档小农场 · 野花笔记
← 全部文档/野花笔记/美术

素材 · gpt-image-2.5 版

提案 #美术#生图#素材#小兔子 docs/野花笔记/素材-gpt-image-2.5版.md
这一版**只有静态素材,没有动画**

按你的要求:先把素材和小兔子做出来看效果,动画(42 帧序列帧)这一轮一帧都没做。 效果你认可之后再做下一步。

一、先说换模型这件事#

你说"换成 gpt-2.5",我查了网关的模型清单,生图相关的有这些:

模型 说明
gpt-image-2.5 ← 这一版用的就是这个
gpt-image-2.5-flare / gpt-image-2.5-sunburst 2.5 的两个变体
gpt-image-2pro / gpt-image-2pro-4k 2pro 系列
gpt-image-2 上一版用的
`image_gen` 工具**不能换模型**,得直接调接口

那个工具固定用 gpt-image-2,参数里没有 model 这一项。 所以我写了 tools/art/genimg.py,直接走网关的 /v1/images/generations, 模型名当参数传。这一版的每一张都是这么出的。

二、兔子#

兔子 · 侧面全身 · 手绘线稿 + 平涂 + 纸纹
兔子 · 侧面全身 · 手绘线稿 + 平涂 + 纸纹

和旧版的对照(左边是代码画的,右边是生图):

左=代码用 PIL 椭圆拼的,右=生图工具生成
左=代码用 PIL 椭圆拼的,右=生图工具生成

左边那只身体是一个椭圆、耳朵是两个叶片形、眼睛是一个小黑椭圆——它是由 4 个几何图元拼起来的。 右边这只:细密手绘线稿、米灰平涂带斑驳、纸张颗粒感。

抠底后的样子(程序实际能用的素材)#

抠掉纸底、裁到实际内容之后的兔子
抠掉纸底、裁到实际内容之后的兔子
生图**不支持透明背景**,必须自己抠

而且不能按"接近米白"直接判颜色——画面里的白毛、白花也是米白, 按颜色判会把兔子内部挖空。 正确做法是从四边 flood fill:只去掉"和画布边界连通"的那一片背景。 实现是 tools/art/gen_cut.py。

三、场景物件(10 个)#

场景物件总览:针叶树 / 阔叶树 / 枯枝 / 灌木 / 高草 / 低草 / 苔藓石 / 石板 / 原木 / 蘑菇
场景物件总览:针叶树 / 阔叶树 / 枯枝 / 灌木 / 高草 / 低草 / 苔藓石 / 石板 / 原木 / 蘑菇

出图原稿(一张图里排一行,再由程序切开):

生图原稿:10 个物件排成一行
生图原稿:10 个物件排成一行
切件不能用"列投影的空白"——这一条踩过

第一版按列投影的空白切,一行 10 个物件只切出 5 件。 原因:树冠在列投影上会和邻居重叠 —— 树干之间有空隙, 但树冠横着铺过来把空隙盖住了。

列投影法只对"左右完全不相交"的物件成立,而植物素材恰恰不是。 改成:先把前景膨胀 4 次(把同一物件的碎叶、离散点并起来), 再跑二维连通域。同一张图切出正好 10 件,和出图要求的数量一致。

四、野花(6 种)#

野花总览:雏菊 / 五瓣花 / 钟形花 / 伞形花序 / 穗状花序 / 绒毛种球
野花总览:雏菊 / 五瓣花 / 钟形花 / 伞形花序 / 穗状花序 / 绒毛种球

出图原稿:

生图原稿:6 株野花排成一行
生图原稿:6 株野花排成一行
这一批比上一版好,但仍然只是"6 种"

上一版(gpt-image-2)视觉复核的原话是「约 6 株、多数没有花头」—— 生图把"12 株各自有花头"简化成了 6 株枝叶。 这一版改成明确要"6 株、每株必须有明显花头",出来的 6 株花形确实各不相同。

但目标是 30 种(5 条风景带 × 6 种)。现在这 6 种只是一轮的量, 还差 24 种,要按这个质感再出 4 轮。

五、拼起来的竖屏场景#

用生图素材拼的竖屏场景 · 兔子和野花地
用生图素材拼的竖屏场景 · 兔子和野花地

做法:天空和远山是程序画的渐变(沿用已验收的灰蓝色板), 树、灌木、草、石头、野花、兔子都是生图素材抠底后摆上去的。 和 tools/art/gen_scene.py 一致。

这张只是**静态合成图**,不是运行时画面

演示页 notes.html 里的运行时场景仍然全部是代码画的几何图形,这一轮没有换。 这张图的作用是回答一个问题:生图素材摆在一起,色调统不统一、前后景分不分得开。

视觉复核的回答是:「偏手绘植物插画风,不是电脑几何图形; 没有明显合成错误、无明显白边或方形抠图痕迹;前景中景远景基本分得开; 低饱和蓝灰加米白、绿色,色彩协调统一。」 唯一提到的问题是「底部雾化较重,前后景界限略弱」——这条要改。

六、这一版没做的事#

别把这些当成已完成
  1. 42 帧序列帧,一帧都没有。 这是下一轮的事,也是这件事真正的难点。
  2. 30 种植物只做了 6 种,还差 24 种。
  3. 运行时场景没换,演示页里还是旧的代码画图形。
  4. 生图素材还没过 check_sat.py / check_tone.py。 这一版的色值是我按提示词写的(#808090 系蓝灰 + #F0E8E0 米白), 和实测的参考图色板方向一致,但逐张量化验收还没跑。
  5. 底部雾化那条(前后景界限略弱)没改。

七、实测:这一版和参考图的距离#

按元素口径(从四边 flood fill 去掉纸底,只看画上去的像素)量:

素材 元素内明度 饱和 P90 色度 P50 元素内暗部
【基准】参考图 0.624 15.3% 12 3.0%
兔子 0.689 16.6% 13.0 3.1%
场景物件(10 个) 0.622 24.4% 16.0 3.9%
野花(6 种) 0.640 10.7% 11.0 0.0%
拼接场景 0.614 19.6% 21.0 8.9%

这一版的色度(11~21)和参考图(12)在同一档 —— 而上一版代码画的素材是 6。

要改的两处:

  • 兔子偏亮(0.689 vs 基准 0.624)。眼下是因为它大面积是米白毛色, 提示词里把"腹部和胸口米白"写得太重了。下一版把背部的灰压深一档。
  • 场景物件的饱和偏高(24.4% vs 基准 15.3%)。 多半来自苔藓石和原木上那点绿色。下一版把 #7E9B93 换成更灰的 #82957C。
  • 野花没有暗部(0.0%),整株都偏亮偏浅,需要加一点深色叶背和花萼。
这一版最值得记的一点

提示词里写死十六进制色值,比写"灰蓝色"有效得多。 上一版(gpt-image-2)我说"muted grey-blue palette", 出来的东西自己发明了一套颜色;这一版我把 #808090、#F0E8E0、 #383E4A 这些实测自参考图的值直接写进提示词,色度就落到了同一档。

反过来说:之前三轮"调色板"的工作没有全废—— 参考图的量化结论(色相 220°、色度恒定 12)正好是这一版提示词的依据。 废掉的是"用这些色号去画椭圆",不是这些色号本身。