mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-01 06:47:29 +00:00
chore(mascot): 立绘 v2 —— 真 alpha 素材 + 头部裁切头像 + 素材判据
老大给的 4 张新立绘里有 3 张是「棋盘格假透明」JPEG(像素是灰白格子,
不是 alpha)。直接进仓库会在深色面板上露出格子,所以先抠成真 alpha 再落盘。
## 为什么主图与头像要分两个文件
现役 mascot.webp 唯一的消费点是**聊天消息的 30px 圆形头像**
(dashboard.js 4 处 aiAvatar + GUI app.js 2 处),概览页并没有放立绘。
主图是坐姿全身,按现有 CSS(object-fit:cover + scale(1.5))裁成圆后
只剩裙子、看不到脸 —— 只换图不做头像版,等于把头像换成一张看不懂的图。
- assets/branding/mascot-xiaozhai.webp 1024² 主立绘(官方展示)
- assets/branding/mascot-xiaozhai-avatar.webp 512² 头部方裁(运行期源)
- internal/plugins/webui/mascot.webp 256² 头像版(原 133KB→24KB)
- cmd/gui/renderer/mascot.webp 128² 头像版(原 133KB→9KB)
参考稿另存三张(不参与运行):sheet(设定总图)/ portrait(半身)/
turnaround(三视图)。
## 抠图怎么做的(可复现,不是手搓)
背景是 20.45px 周期的棋盘格(237/254 两色)。判据取「中性灰 且 灰度≥228」
的像素做候选,再从图像边界做连通域传播 —— 这样白裙子/白围裙因为不中性
(带蓝调)不会被误判,避免了当年 site/README 记录的 flood-fill 渗色问题。
边界再内缩 1px 抹白边,0.7px 高斯羽化去锯齿。抠完透明占比 55.8%,
深/浅两种背景上目检均无残留格子与白边。
## CSS:scale(1.5) → 1.25
原来的 1.5 是为「全身图裁圆」补的放大。换成头部方裁后,1.5 会切掉两侧
发绳与呆毛 —— 按真实 30px 渲染放大对照看过 1.0/1.15/1.25/1.4 四档。
## 新增判据(含反向验证)
internal/plugins/webui/mascot_asset_test.go 直接读 WebP 容器头,
断言 VP8X 的 Alpha 标志位与 ALPH chunk **同时存在**,外加正方形/≥128px/
≤128KB。理由:这类退化在肉眼 review 里抓不住(缩到 30px 就是一团浅色),
而用户每天都在看;且 site/README.md 记着当年正因为「白底图没法抠」
干脆不放立绘,这个坑值得一个自动化判据。
反向验证(已实跑,非声称):把素材换成 HEAD 旧图,判据报红并准确指出
「Alpha 标志位未置位 / 缺 ALPH chunk / 体积超限」;换回新图转绿。
另有一条独立用例构造「带 VP8X 但不置 Alpha 位」的最小容器,
确认解析器不会对退化素材误判为绿。
## 顺带修的两处
1. assets/docs/{zh,en}/PLUGIN_DEV.md 的 mascot 引用路径是坏的:
`../../assets/branding/...` 从 assets/docs/zh/ 出发解析成
`assets/assets/branding/...`,文件不存在(旧版一直是坏的)。
已改为 `../../branding/...` 并逐条验证路径可解析。
同时指向新的头像版(那处是 20px 圆形内联小图标)。
2. gzip.go / gzip_test.go 注释里的「mascot.webp(133KB)」改为不带死数字
的说法 —— 体积会随素材变,注释写死数字只会变成误导。
## 验证
go build ./... → 0
go vet ./internal/plugins/webui/ ./cmd/gui/ → 干净
gofmt -l → 空
go test ./internal/plugins/webui/ -count=1 → ok(15.1s,含新增 2 个用例)
## 没做的事
- 没碰 main、没开 PR、没部署、没重启服务。
- **概览页仍未放立绘**。site/README 里「素材不可用」这条已不成立(素材有
alpha 了),但版面是否该放图属于设计取舍,不在本次范围 —— 文档已相应改写,
不再用「素材不行」当理由。
- 抠图对发丝边缘是「够用」不是「完美」:0.7px 羽化在 1024 下看不出来,
但若将来要印物料级大图,需要重出带原生 alpha 的源图。
This commit is contained in:
@ -84,18 +84,24 @@ server {
|
||||
|
||||
所有 listener 走 `requestAnimationFrame` 节流;标签页隐藏时暂停粒子。
|
||||
|
||||
## 为什么最终没有图
|
||||
## 看板娘素材:从「没法用」到「能用了」
|
||||
|
||||
试过放看板娘立绘,失败,最后决定不放。过程留在这里,免得下次重复踩:
|
||||
> 结论先写在这:**素材侧的问题已经解决**(现役 `mascot-xiaozhai.webp` 自带真 alpha,
|
||||
> 1024×1024)。下面保留当年的失败记录,因为「为什么当时不行」这件事本身
|
||||
> 仍是有用约束——它解释了为什么不能拿一张白底图硬塞进深色版面。
|
||||
|
||||
原图 `mascot-xiaozhai.webp` 是**不透明** WebP(无 alpha),白底 + 蓝紫渐变外框。
|
||||
### 当年为什么不行
|
||||
|
||||
试过放看板娘立绘,失败,最后决定不放。
|
||||
|
||||
原图(旧版)是**不透明** WebP(无 alpha),白底 + 蓝紫渐变外框。
|
||||
直接用 = 深色页面上一个刺眼的白色方块;抠图又不可行:
|
||||
|
||||
```bash
|
||||
python3 -c "
|
||||
from PIL import Image
|
||||
im = Image.open('assets/branding/mascot-xiaozhai.webp')
|
||||
print(im.mode) # RGB —— 没有 alpha 通道
|
||||
print(im.mode) # 旧版是 RGB —— 没有 alpha 通道
|
||||
"
|
||||
```
|
||||
|
||||
@ -104,8 +110,28 @@ print(im.mode) # RGB —— 没有 alpha 通道
|
||||
「圆角卡面 + 发光边框 + 底部渐隐」,视觉上能接受,但本质上是在方形图上盖装饰,
|
||||
而非让图融入页面。
|
||||
|
||||
结论:**这类素材要么重新出一张带透明通道的图,要么就不放**。
|
||||
现在 Hero 是单栏文字,版面反而更稳。
|
||||
### 现在为什么能了
|
||||
|
||||
新版素材走的是另一条路:出图时背景就是**棋盘格提示**,再按「背格连通域 +
|
||||
中性灰判据」抠成真 alpha,落盘为带 `ALPH` chunk 的 WebP。
|
||||
|
||||
```bash
|
||||
python3 -c "
|
||||
from PIL import Image
|
||||
im = Image.open('assets/branding/mascot-xiaozhai.webp')
|
||||
print(im.mode) # RGBA
|
||||
"
|
||||
```
|
||||
|
||||
同一件事在代码里也有判据钉住:`internal/plugins/webui/mascot_asset_test.go`
|
||||
直接读 WebP 容器头,断言 VP8X 的 Alpha 标志位与 `ALPH` chunk 同时存在——
|
||||
防止日后有人把一张「看起来透明」的棋盘格 JPEG 换进来。
|
||||
|
||||
### 但版面仍未放图
|
||||
|
||||
素材不再是阻碍,**但这不等于 Hero 就该放图**。现版面是单栏文字,加图会改变
|
||||
信息密度与首屏节奏,属于设计取舍而非素材问题——所以这一步没有动。
|
||||
要放的话,素材已经就绪。
|
||||
|
||||
## 插件卡片
|
||||
|
||||
|
||||
Reference in New Issue
Block a user