Files
tamabox/docs/theme-shiroko-assets-spec.md
tamakyi 34a262091b 修 shiroko 单车/步枪素材「白色没抠」:白上白只能全白转透明
根因不是抠图参数:素材是白底+白车架,车架涂装与背景白是同一个值(都是 #f9f9f9),
颜色上无法分离。四角 floodfill 只吃掉外圈,轮圈内、车架三角、车筐、枪与车架之间的白整块留着,
量化就是不透明像素里近白(>240) 占 50%。

- 处置:min(r,g,b)≥238 软过渡 + 饱和度>14 保留彩色 → 白全透明。近白降到 0.0%,
  不透明率 19.4%,29KB;轮辐/车架/车筐成为描边,粉轮圈、蓝枪托、接触阴影保留
- 试过「按近白厚度区分白洞与白涂装」(腐蚀测厚度)→ 失败:轮辐间扇形白楔 9~13px 与车架管
  5~10px 重叠,阈值怎么调都会留白楔,比原图更难看
- 画布保持 397×259 不裁:deco-size 是 auto 259px,宽度按比例算,裁了锚点会漂
- css 图片 ?v= → 20261021a;StaticVersion 20261021c → 20261021d(css 内容变了必须换缓存键)
- docs:assets-spec 补「白上白」取舍与验收项「不透明像素近白占比≈0」,theme-shiroko 素材表同步
2026-10-21 19:18:50 +08:00

128 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 主题素材规格(shiroko)
给外部生成工具用的参数表。照着填尺寸/比例/雾度,导出后按「换图清单」替换即可。
所有尺寸都按 **2× 出图、1× 显示** 写,避免高分屏发虚。
## 一、总表
| 文件 | 用途 | 画布(生成) | 画布(导出) | 显示尺寸 | 透明 | 体积上限 |
| --- | --- | --- | --- | --- | --- | --- |
| `chibi/window.webp` | 人物 | 270 × 920 | 135 × 460 | 高 400px(宽 ≈117) | ✅ 需要 | 40 KB |
| `props/bike.webp` | 自行车 + 步枪 | 794 × 518 | 397 × 259 | 高 259px(宽 ≈397) | ✅ 需要 | 40 KB |
| `scene-desktop.webp` | 教室背景(桌面) | 3840 × 2160 | 1920 × 1080 | `cover` 铺满 | ❌ 不需要 | 40 KB |
| `scene-mobile.webp` | 教室背景(≤900px) | 1440 × 2006 | 720 × 1003 | `cover` 铺满 | ❌ 不需要 | 30 KB |
| `pattern-dark.svg` | 深色模式平铺纹样 | 240 × 240 | 240 × 240 | 平铺 | ❌ | 2 KB |
比例(认准这个,比像素更重要):
- 人物 **1 : 3.41**(宽 : 高 ≈ 0.293)
- 道具 **1.53 : 1**(397 : 259)
- 桌面背景 **16 : 9**
- 移动背景 **0.718 : 1**(≈ 9 : 12.5)
## 二、人物 `chibi/window.webp`
| 项 | 值 |
| --- | --- |
| 画布 | 270 × 920 px,透明背景 |
| 姿势 | 侧后方 3/4 视角、双手背在身后、头略向右(**不要正面直视**) |
| 脚底 | **贴画布底边**(误差 ±4px),不要留空白 |
| 头顶 | 贴画布上沿;若画光环,环心必须透明 |
| 左右余量 | 各留 10~20px,别让手臂被画布裁掉 |
| 雾度 | RGB 压白 **16%**:`v' = v×(1-0.16) + 255×0.16` |
| 色彩 | 下表是**压白 16% 之后**的显示值,生成时按 `原色 = (显示值 − 40.8) / 0.84` 反算 |
| 部位 | 显示值 | 生成时用 |
| --- | --- | --- |
| 头发 | `#c4c3c6` | `#b9b8bb` |
| 围巾 | `#8abbc6`(青绿,别用纯蓝) | `#8fc1c9` |
| 西装 / 上衣 | `#565e72` | `#3a4256` |
| 鞋 | `#4f4f4f` | `#3f3f3f` |
| 袜 | `#ffffff` | **用 `#ededed`**(纯白会和背景粘在一起,抠图会吃穿) |
| 光环 | `#8abbc6` 细环 | `#7fd3dc` |
要点:
- **不能有描边**。平涂色块、无 line art、无渐变。
- 抠图后检查三处必须透明:**手与背之间**、**两腿之间**、**光环环心**。
这三处是闭合区域,只从四角抹白是抹不掉的(我们踩过)。
- 白袜子是 `#ededed` 左右,背景是 `#fdfdfd`,两者只差 16 级——抠图时**不要把阈值开大**,否则袜子会被吃穿。
## 三、道具 `props/bike.webp`
| 项 | 值 |
| --- | --- |
| 画布 | 794 × 518 px,透明背景 |
| 内容 | 银色/白色城市自行车 + 一把细长步枪斜靠车架 |
| 朝向 | **车头朝右**(和人物同向) |
| 地面 | 轮子底线贴画布底部,下方留 12~16px 给接触阴影 |
| 阴影 | 可以在图内自带一层椭圆软影(不透明度 15~20%,模糊 8~12px) |
| 雾度 | RGB 压白 **26%**(比人物淡一档,它在人身后) |
| 背景 | **必须是纯色绿幕或透明**,不要白底(白色车架 + 白底 = 无法分离,见下方“白上白”) |
要点:
- 侧视图即可,但不要画成“图标”——轮辐、脚踏、链条这些细节保留,否则缩到 259px 会变成一个圈。
- 枪要细长、冷色(灰蓝),**不要木色**(会像双管猎枪)。
⚠️ **白上白(本项目踩过)**:白底 + 白车架时,车身涂装和背景是同一个白(实测都是 `#f9f9f9`,
差 0~3 级),颜色完全分不开;四角 floodfill 只能吃掉外圈,轮圈内、车架三角、车筐里的白会整块留下,
看上去就是「没抠干净」。此时的取舍只有两条:
1. 把这批白**全部**设为透明 —— 车身填色一起走,成品是**线稿风**(描边 + 粉色轮圈 + 蓝枪托仍在,
轮辐、车架、车筐网格都清楚,现有的 `bike.webp` 就是这么做出来的,不透明率 19.4%、剩余近白 0%);
2. 重新出一张**绿幕/透明背景**的素材,车身用浅灰蓝等中间调(白车在浅色场景里本来就发飘)。
## 四、场景 `scene-desktop.webp`
| 项 | 值 |
| --- | --- |
| 画布 | 3840 × 2160(16:9),不透明 |
| 导出 | 1920 × 1080,WebP q82 |
| 色调 | 灰蓝/暖白,均值亮度 **235~245**,标准差 6~9(几乎是白雾) |
| 处理 | 整体压白 30~38%,高斯模糊 1.2~1.4px |
**构图硬约束(这条最容易翻车):**
1. **左侧 0~22% 的前景必须是空地(地板)**,不能有课桌、椅子、书包。
人物是贴在最上层的独立图层,脚下必须有地面,否则会读成“站在课桌上”。
2. 课桌、椅子、黑板放在**中部偏右**,因为中间会被卡片完全盖住。
3. **不要有必须完整露出的元素**(`background-size: cover` 会按视口裁两侧,1080 高的屏裁掉约 5%)。
4. 不要出现人、文字、水印。自行车也不要画进背景——它要跟着人物一起移动。
5. 玻璃/窗框这类高频细节会干扰卡片可读性,右侧留白区尽量干净。
## 五、换图清单
1. 覆盖同名文件(格式 `WebP`,有透明的存 `q88`,场景存 `q82`)。
2. `static/css/themes/shiroko.css`:
- 若**显示尺寸不变**:只改三处 URL 的 `?v=`(图片不走 `StaticVersion`,缓存 1 天)。
- 若显示尺寸变了:改 `--tb-deco-size` 的 `auto 400px`(人) / `auto 259px`(车)。
3. `internal/conf/static.go` 的 `StaticVersion` +1(CSS 改了必须)。
4. 重新编译部署(静态资源是编译期 embed,只重启不重编不会变)。
### 定位公式(改比例时才需要算)
`background-position` 的百分比是相对 **(定位区宽 − 图片宽)**,不是视口宽:
```
实际 left = (视口宽 - 显示宽) × (pos%) + 偏移量
```
当前值(视口 1512 时:人物左沿 173px、车左沿 -55px,两者重叠区由人物遮住):
```css
/* 人物:显示高 400,显示宽 = 400 × 0.293 ≈ 117 */
left: max(10px, calc(50% - 524px)) bottom 36px;
/* 车:显示高 259,显示宽 ≈ 397 */
left: calc(50% - 612px) bottom 20px;
```
## 六、验收(不看代码也能查)
1. **白边**:放大 300% 看轮廓,出现 1px 白色描边就是没抠干净。
2. **闭合区域**:手内侧、腿间、环心应能透出背景色。
3. **接地**:脚底/轮底离画布底边 ≤ 4px;有阴影时阴影在轮子内侧。
4. **体积**:人 ≤40KB、车 ≤40KB、场景 ≤40KB(现在分别是 15 / 29 / 19 KB)。
5. **深色模式**:所有图片在深色下都不显示,不用管。
6. **白上白**:车这类「白底 + 白主体」的素材,验收要额外看「不透明像素里近白(>240)的占比」——
正常应接近 0;本项目修复前是 **50%**,说明一半的不透明区域其实是背景白。