# 暗金荒野主题资产切片研究 生成时间:2026-07-17T16:41:28+08:00 ## 输入资产 - 背景图:`sessions/_attachments/094d7907-875d-41f4-9985-992c87c9b9cc.webp` - 图标板:`sessions/_attachments/43bd9ed6-2ba6-4c9d-bd9d-25b068cb4711.webp` - 完整界面参考:`sessions/_attachments/f01c1388-b603-434a-b226-2ff5771d4925.webp` 三张图尺寸均为 `1672x941`,格式为 RGB WebP,无 alpha 通道。 坐标约定:本文所有裁剪框均使用 `[x, y, w, h]`,其中 `x+w` / `y+h` 是右边界 / 下边界的排他坐标。由于源图是有损 WebP,边缘估算建议按 `±3px` 处理;真正导出时可再外扩 `2-4px` 做抗锯齿和阴影保留。 ## 背景图定位与遮罩建议 ### 视觉结构 - 左侧 `x=0-740` 是较干净的暗色烟雾区,适合承载侧边栏、搜索框、会话列表和中左侧主内容。 - 右侧 `x=920-1560, y=80-760` 是人物、法阵和权杖主体,视觉权重高,不适合直接压大段正文。 - 下方 `y=780-941` 有烟尘、碎石和暗部,可放输入框,但输入框自身需要较实的半透明面板。 - 背景平均亮度很低,左侧安全区采样亮度约 `22/255`,右侧人物区约 `38/255`;遮罩目标不是继续压暗整图,而是稳定文本和边框对比。 ### 推荐 CSS 桌面端推荐保留人物在右中部,同时让左侧和主聊天区域更稳: ```css .theme-gilded-wasteland { position: relative; min-height: 100vh; color: var(--gilded-text); background-color: #050707; overflow: hidden; } .theme-gilded-wasteland::before { content: ""; position: fixed; inset: 0; z-index: -2; background-image: url("/assets/theme/gilded-wasteland/background.webp"); background-size: cover; background-position: 62% 50%; background-repeat: no-repeat; } .theme-gilded-wasteland::after { content: ""; position: fixed; inset: 0; z-index: -1; pointer-events: none; background: linear-gradient( 90deg, rgba(4, 6, 6, 0.94) 0%, rgba(4, 6, 6, 0.86) 18%, rgba(4, 6, 6, 0.58) 48%, rgba(4, 6, 6, 0.30) 70%, rgba(4, 6, 6, 0.62) 100% ), linear-gradient( 180deg, rgba(0, 0, 0, 0.40) 0%, rgba(0, 0, 0, 0.08) 24%, rgba(0, 0, 0, 0.16) 70%, rgba(0, 0, 0, 0.70) 100% ), radial-gradient( ellipse at 74% 34%, rgba(216, 168, 92, 0.12) 0%, rgba(216, 168, 92, 0.04) 22%, transparent 42% ); } @media (max-width: 720px) { .theme-gilded-wasteland::before { background-position: 70% 50%; } .theme-gilded-wasteland::after { background: linear-gradient(90deg, rgba(4, 6, 6, 0.92), rgba(4, 6, 6, 0.76)), linear-gradient(180deg, rgba(0, 0, 0, 0.42), rgba(0, 0, 0, 0.72)); } } ``` ### 定位取值 - 常规桌面:`background-position: 62% 50%`,人物仍在右侧,左中区域更可读。 - 参考图同尺寸复刻:`background-position: center center` 也可用,因为参考图本身没有裁切。 - 侧边栏更宽或主面板偏左时:可调到 `64% 50%`,避免人物头部过早进入主消息卡片。 - 移动端:建议 `70% 50%` 并提高遮罩不透明度,优先保证内容可读。 ## 图标板网格边界 图标板不是透明 sprite,而是「暗色背景 + 金色边框 + 标题 + 三规格图标 + 尺寸标签」的展示板。建议把它作为切片源,不要直接拿整板做 CSS sprite。 ### 列边界 | 列 | x0 | x1 | 宽度 | | --- | ---: | ---: | ---: | | C1 | 50 | 295 | 245 | | C2 | 315 | 562 | 247 | | C3 | 582 | 829 | 247 | | C4 | 846 | 1092 | 246 | | C5 | 1111 | 1358 | 247 | | C6 | 1377 | 1621 | 244 | ### 行边界 | 行 | y0 | y1 | 高度 | | --- | ---: | ---: | ---: | | R1 | 50 | 187 | 137 | | R2 | 201 | 339 | 138 | | R3 | 354 | 490 | 136 | | R4 | 506 | 641 | 135 | | R5 | 655 | 786 | 131 | | R6 | 798 | 927 | 129 | ### 卡片矩阵 | 卡片 | 名称 | 整卡裁剪框 `[x,y,w,h]` | | --- | --- | --- | | R1C1 | new chat | `[50,50,245,137]` | | R1C2 | dropdown | `[315,50,247,137]` | | R1C3 | search | `[582,50,247,137]` | | R1C4 | shortcut | `[846,50,246,137]` | | R1C5 | collapse / expand | `[1111,50,247,137]` | | R1C6 | add (circle) | `[1377,50,244,137]` | | R2C1 | theme / star | `[50,201,245,138]` | | R2C2 | ai swirl | `[315,201,247,138]` | | R2C3 | status (online) | `[582,201,247,138]` | | R2C4 | loading | `[846,201,246,138]` | | R2C5 | attachment | `[1111,201,247,138]` | | R2C6 | send | `[1377,201,244,138]` | | R3C1 | stop | `[50,354,245,136]` | | R3C2 | settings | `[315,354,247,136]` | | R3C3 | user / profile | `[582,354,247,136]` | | R3C4 | terminal / prompt | `[846,354,246,136]` | | R3C5 | copy | `[1111,354,247,136]` | | R3C6 | delete | `[1377,354,244,136]` | | R4C1 | refresh | `[50,506,245,135]` | | R4C2 | folder | `[315,506,247,135]` | | R4C3 | chat bubble | `[582,506,247,135]` | | R4C4 | notification | `[846,506,246,135]` | | R4C5 | upload | `[1111,506,247,135]` | | R4C6 | download | `[1377,506,244,135]` | | R5C1 | info | `[50,655,245,131]` | | R5C2 | warning | `[315,655,247,131]` | | R5C3 | close | `[582,655,247,131]` | | R5C4 | check | `[846,655,246,131]` | | R5C5 | lock | `[1111,655,247,131]` | | R5C6 | eye / visibility | `[1377,655,244,131]` | | R6C1 | fullscreen | `[50,798,245,129]` | ## 常用图标推荐裁剪框 默认建议切 32px 规格,因为它能向下缩放到 24px / 16px,且保留更多金属高光和阴影。下表是「图标主体裁剪框」,不包含卡片标题、尺寸标签和外框。 | 图标语义 | 来源卡片 | 32px 主体框 `[x,y,w,h]` | 备注 | | --- | --- | --- | --- | | new chat | R1C1 | `[204,85,69,65]` | 十字星形,外扩较多以保留长尖角 | | search | R1C3 | `[746,86,62,62]` | 放大镜手柄在右下,透明化时保留阴影 | | dropdown | R1C2 | `[480,98,59,45]` | 三角图标高度较小,可居中放入 32px 容器 | | theme / star | R2C1 | `[204,236,70,65]` | 星芒很长,不建议再紧缩 | | ai swirl | R2C2 | `[476,236,65,65]` | 旋涡近似正方形 | | status / online | R2C3 | `[749,242,53,53]` | 需要把绿色填充计入 mask | | attachment | R2C5 | `[1277,236,49,60]` | 回形针纵向更高,容器内垂直居中 | | send | R2C6 | `[1533,237,63,57]` | 纸飞机尖角在右上 | | stop | R3C1 | `[211,392,56,56]` | 方形停止按钮 | | settings | R3C2 | `[476,389,65,62]` | 齿轮外齿需要保留 | | user / profile | R3C3 | `[743,389,65,62]` | 头像圆框 | | terminal / prompt | R3C4 | `[1009,393,59,55]` | 矩形外框有阴影 | | copy | R3C5 | `[1278,392,48,56]` | 双页图标偏窄 | | refresh | R4C1 | `[211,541,57,57]` | 圆箭头 | | chat bubble | R4C3 | `[745,541,62,55]` | 气泡尾巴在左下 | | close | R5C3 | `[749,690,53,53]` | X 形,适合放入 32px 方形容器 | | check | R5C4 | `[1010,693,56,47]` | 勾号高度较小,容器内垂直居中 | ### 16px / 24px / 32px 自动裁剪规则 整卡内三个规格的位置基本稳定,推荐通过卡片边界自动切,而不是手工维护所有坐标。 1. 先按上文卡片矩阵定位目标卡片。 2. 在卡片内部建立三个横向检测带: ```text 16px: [card.x + 18, card.x + 70] 24px: [card.x + 82, card.x + 145] 32px: [card.x + 152, card.x + card.w - 20] ``` 3. 纵向检测带取: ```text [card.y + 35, min(card.y + card.h - 35, card.y + 100)] ``` 4. 对检测带内像素建立图标 mask: ```text gold = r > 75 && g > 48 && b < 90 && r >= g - 8 && r - b > 22 pale = r > 135 && g > 105 && b < 95 && r - b > 35 green = g > 70 && r < 95 && b < 80 && g - r > 8 mask = gold || pale || green ``` 5. 对 mask 像素取最小外接矩形,再外扩 `4px` 得到主体裁剪框。 6. 如果要导出统一尺寸图标,把主体框透明化后放入固定画布: | 源规格 | 推荐输出画布 | 用途 | | --- | ---: | --- | | 16px | `20x20` 或 `24x24` | 列表小图标、状态点 | | 24px | `32x32` | 常规按钮 | | 32px | `40x40` 或 `48x48` | 主操作按钮、头像旁标识 | ### 自动检测边界算法 卡片边界可以用金色边缘峰值检测自动恢复,适合后续批量生成 manifest。 ```text 1. 读取 RGB WebP。 2. 计算相邻像素梯度: edge = abs(r-r0) + abs(g-g0) + abs(b-b0) 3. 对 edge > 18 的像素分别累加到 x/y 投影。 4. 对投影做半径 1-2px 的平滑。 5. 在 x 轴选取强峰并按宽度 239-247px 配对,得到左右边界: [50,295], [315,562], [582,829], [846,1092], [1111,1358], [1377,1621] 6. 在 y 轴选取强峰并按高度 129-138px 配对,得到上下边界: [50,187], [201,339], [354,490], [506,641], [655,786], [798,927] 7. 用卡片位置矩阵给每个 cell 赋语义标签。 8. 在 cell 内按 16/24/32 检测带取主体 mask 外接框。 ``` ## 透明化与输出格式方案 ### 图标透明化 源图标板是 RGB WebP,背景和图标都已经混合压缩,不能直接得到完美 alpha。推荐流程: 1. 从图标板按主体框裁剪,裁剪时外扩 `2-4px`。 2. 从裁剪框边缘做暗背景 flood-fill,把与边缘连通且亮度低、饱和度低的区域标记为背景。 3. 对非背景像素按亮度和色相生成 alpha: - 金色 / 浅金高光:保留。 - 绿色状态图标:单独保留,避免被金色阈值漏掉。 - 暗色压缩噪点:alpha 压低到 `0`。 4. 对 alpha 做轻微 `1px` 羽化,减少 WebP 黑边。 5. 把图标居中放入统一画布,按钮内再用 CSS 控制 `width/height`。 建议保留一份 manifest,记录源图、源框和输出文件名,后续可重复生成: ```json { "search": { "source": "43bd9ed6-2ba6-4c9d-bd9d-25b068cb4711.webp", "card": "R1C3", "variant": "32px", "bbox": [746, 86, 62, 62], "output": "icons/search-32.png" } } ``` ### 输出格式 - 背景:保留 WebP 或转 AVIF/WebP 两套,作为 CSS 背景图,不需要透明通道。 - 图标主格式:透明 PNG。它对 alpha 最稳,适合切片后人工复核和 UI 直接引用。 - 图标 Web 优化:可额外导出 lossless WebP,使用 `image-set()` 或构建工具按浏览器能力选择。 - 不建议:直接用原始图标板做 CSS sprite。它包含展示卡片、标题、尺寸标签和暗纹理背景,透明化与 hover/filter 都会困难。 ### 质量检查点 - 用深色、浅色、半透明按钮背景分别检查黑边。 - 对 `status / online` 单独检查绿色中心是否完整。 - 对 `new chat`、`theme / star`、`send` 检查尖角是否被裁掉。 - 对 `dropdown`、`check` 这类非方形图标,导出后应放入统一画布居中,而不是强行拉伸。