☰
hekate / Nyx 界面美化实战指南:背景图、启动图标与 `_hue` / `_nobox` 后缀规则详解
2026/9/25 3:12:02 网站建设 项目流程
  • 嵌入式
  • 固件
  • 系统编程

【免费下载链接】hekate

hekate - A GUI based Nintendo Switch Bootloader

项目地址:https://gitcode.com/gh_mirrors/he/hekate
点击查看免费下载

Nyx 是 hekate 图形界面(GUI)的自定义主题层,其视觉效果完全由 SD 卡上bootloader/res/目录中的资源文件驱动:一张 1280×720 的 32 位 BMP 背景图,加上若干 192×192 的 32 位 BMP 启动图标,即可在数分钟内把 Nyx 主页变成专属风格。本文将围绕 nyx/README_RES.md 的官方说明,结合仓库源码逐条拆解背景图规格、图标放置方式、_hue.bmp/_nobox.bmp/_hue_nobox.bmp三种后缀的着色与去边框行为,以及icon=与icon_*_custom.bmp的覆盖优先级,让你能安全、准确地制作和部署自己的 Nyx 主题资源。

Nyx 主题资源的核心事实

  • 入口文档:nyx/README_RES.md(原文档,以下引用简称“原文档”);
  • 配套模板:res/hekate_ipl_template.ini;
  • 源码实现:nyx/nyx_gui/nyx.c(背景与默认图标加载)、nyx/nyx_gui/frontend/gui.c(启动图标解析与按钮绘制);
  • 适用对象:使用 Nyx GUI(nyx目录构建产物)的 hekate 用户,以及希望把 SD 卡界面定制成一致风格的主题作者。

背景图(background.bmp):1280×720、32 位、Alpha 必需

文件位置与命名

原文档明确:背景图必须放在

bootloader/res/background.bmp

对应源码中,Nyx 在nyx_load_bg_icons()内通过

hekate_bg = bmp_to_lvimg_obj("bootloader/res/background.bmp");

加载该文件(nyx/nyx_gui/nyx.c)。也就是说,主题作者把这张图放到该路径后,Nyx 启动主页(Home Tab)就会以它作为背景底图。

硬性规格:1280×720 且为 32 位 BMP

  • 分辨率:必须是 1280×720。Nyx 的屏幕坐标系与按钮布局按 1280×720 设计(参见 nyx/nyx_gui/frontend/gui.c 中btn_width = 200; btn_height = 200;等按钮尺寸与 592 像素高度的滚动区lv_page_set_scrl_height(parent, 592);),因此尺寸不符会被直接拉伸或裁切,产生错位。
  • 位深:必须为 32 位 BMP(每像素含 8 位 Alpha)。原文档特别提醒:渲染时 Alpha 混合(alpha blending)是生效的;因此如果需要实底背景,Alpha 通道值必须设为0xFF(完全不透明),否则背景会呈现半透明叠加在默认界面上。

原文档还提到“有网站可以生成正确的 BMP”。制作时可用常见图像软件导出“32-bit BMP / ARGB”格式,并确认导出选项包含 Alpha 通道。注意这与 Bootlogo 的规格不同——Bootlogo 的说明见 README_BOOTLOGO.md,它允许任意尺寸(最大 720×1280)、自动居中且只支持 32 位 ARGB BMP;背景图则是严格的 1280×720。

背景加载的源码级佐证

在 nyx/nyx_gui/nyx.c 中,nyx_load_bg_icons()依次完成三件事:

  1. 若存在bootloader/res/icon_switch_custom.bmp则加载之,否则加载bootloader/res/icon_switch.bmp(nyx/nyx_gui/nyx.c);
  2. 若存在bootloader/res/icon_payload_custom.bmp则加载之,否则加载bootloader/res/icon_payload.bmp(nyx/nyx_gui/nyx.c);
  3. 加载bootloader/res/background.bmp(nyx/nyx_gui/nyx.c)。

可见这三类资源都集中在bootloader/res/下,命名固定,替换即生效,无需编译任何代码。

启动图标:192×192、32 位 BMP、自由使用透明度

图标规格

原文档给出:支持的图标为192×192 的 32 位 BMP,并且可以“随意使用透明度”,与按钮背景做漂亮的叠加效果。

之所以强调“32 位 + 透明度”,是因为 Nyx 会把这个 BMP 作为按钮上的lv_img对象渲染,Alpha 通道直接参与混合(参见 nyx/nyx_gui/frontend/gui.c 中lv_img_create/lv_img_set_src(img, bmp)的用法)。如果图标是纯白且带透明通道的“线稿”,还能配合下面的_hue机制被整体着色。

图标的两种放置方式

原文档给出两种方案:

  1. 按启动项名字命名:在bootloader/res/下放置<boot entry name>.bmp,例如启动项名为CFW时放bootloader/res/CFW.bmp。
  2. icon=键指定路径(推荐):在启动项的[section]内写icon={sd path},例如icon=bootloader/res/my_icon.bmp。

源码中的实际解析顺序如下(nyx/nyx_gui/frontend/gui.c):

  1. 解析bootloader/ini下的配置文件(ini_parse(&ini_sections, "bootloader/ini", true));
  2. 遍历每个 boot entry 小节,查找icon键(nyx/nyx_gui/frontend/gui.c);
  3. 若没有icon键,则依次尝试:
    • bootloader/res/<entry>.bmp
    • bootloader/res/<entry>_hue_nobox.bmp
    • bootloader/res/<entry>_hue.bmp
    • bootloader/res/<entry>_nobox.bmp(见 nyx/nyx_gui/frontend/gui.c)
  4. 若有icon键,直接加载该路径,并按文件名后缀判断是否着色 / 去边框(见下节);
  5. 若以上都没有,且该条目带payload=键,则回退到默认的 payload 图标(icon_payload),否则回退到默认的 Switch 图标(icon_switch),且当不存在*_custom.bmp时默认图标会被着色(nyx/nyx_gui/frontend/gui.c)。

模板文件中也明确写了这一风格化键的用途:res/hekate_ipl_template.ini 中注释“like logopath= key which is for bootlogo and icon= key for Nyx icon.”。注意配置文件的语法约束也一并继承:不要在键名前后留空格、不要用#注释(用;),否则条目会解析失败(res/hekate_ipl_template.ini)。

三种后缀魔法:_hue、_nobox、_hue_nobox

这是原文档的核心“玩法”,源码给出了精确判定逻辑。

_hue.bmp:按主题色自动着色

原文档:图标名以_hue.bmp结尾时,图标会被着色(colorized);这只有在“白色布局 + 透明通道”的图标上效果才好看。

源码判定(nyx/nyx_gui/frontend/gui.c):

if (bmp && strlen(icon_path) > 8 && !memcmp(icon_path + strlen(icon_path) - 8, "_hue", 4)) img_colorize = true;

着色在渲染层通过img_style实现:当img_colorize为真时,会调用lv_img_set_style(img, &img_style);(nyx/nyx_gui/frontend/gui.c)。也就是说,白色图形区域会被替换为当前主题/按钮的主色,透明区域保持透明——所以白底线稿能直接融入任意配色。

_nobox.bmp:去掉按钮底框

原文档:使用_nobox.bmp时,按钮背景被移除,适合追求特定视觉风格的主题。

源码判定(nyx/nyx_gui/frontend/gui.c):

if (bmp && strlen(icon_path) > 10 && !memcmp(icon_path + strlen(icon_path) - 10, "_nobox", 6)) img_noborder = true;

当img_noborder为真时,按钮尺寸由图标尺寸推导(宽高 =bmp->header.w + 4,超过 200 则截断为 200),并使用无边框样式btn_home_noborder_rel渲染(nyx/nyx_gui/frontend/gui.c)。

_hue_nobox.bmp:着色 + 去边框组合

原文档:两种效果可组合,即文件名以_hue_nobox.bmp结尾。

源码优先判定组合(nyx/nyx_gui/frontend/gui.c):

if (bmp && strlen(icon_path) > 14 && !memcmp(icon_path + strlen(icon_path) - 14, "_hue_nobox", 10)) { img_colorize = true; img_noborder = true; }

注意组合判断在前,因此_hue_nobox不会被误拆成“只有_hue”或“只有_nobox”。

后缀规则对两种放置方式都生效

原文档虽然没有逐条展开,但从源码可以看到:后缀判断在icon=路径分支内(nyx/nyx_gui/frontend/gui.c),而“按启动项名字命名”的分支也会尝试<entry>_hue_nobox.bmp、<entry>_hue.bmp、<entry>_nobox.bmp三个候选(nyx/nyx_gui/frontend/gui.c)。所以两种方式都能用后缀,推荐优先使用icon=指定路径,因为它在文件名上更自由(可放在 SD 任意位置),且语义更明确。

默认图标替换:icon_switch_custom.bmp与icon_payload_custom.bmp

原文档最后一段说明:默认系统图标icon_switch.bmp与icon_payload.bmp可被替换;如果存在icon_switch_custom.bmp或icon_payload_custom.bmp,则加载自定义版本。

源码佐证(nyx/nyx_gui/nyx.c):

if (!f_stat("bootloader/res/icon_switch_custom.bmp", NULL)) icon_switch = bmp_to_lvimg_obj("bootloader/res/icon_switch_custom.bmp"); else icon_switch = bmp_to_lvimg_obj("bootloader/res/icon_switch.bmp"); if (!f_stat("bootloader/res/icon_payload_custom.bmp", NULL)) icon_payload = bmp_to_lvimg_obj("bootloader/res/icon_payload_custom.bmp"); else icon_payload = bmp_to_lvimg_obj("bootloader/res/icon_payload.bmp");

几点实战细节:

  • 自定义版本存在时,该图标默认不做着色;只有当icon_sw_custom/icon_pl_custom为假(即未加载到 custom 版本)时才会走img_colorize(nyx/nyx_gui/frontend/gui.c 与 nyx/nyx_gui/frontend/gui.c)。也就是说:想用默认图标配色,就放白底透明线稿的icon_switch.bmp/icon_payload.bmp;想用自己定义的多彩图标,就放icon_*_custom.bmp。
  • 所有默认与自定义图标都应在bootloader/res/目录下,规格同为 192×192 32 位 BMP。

配置文件中的icon=完整示例

结合 res/hekate_ipl_template.ini 的格式约定,一个可直接套用的启动项示例:

[CFW SysNAND] payload=bootloader/payloads/reboot_payload.bin icon=bootloader/res/cfw_hue_nobox.bmp logopath=bootloader/bootlogo_cfw.bmp

说明:

  • icon=bootloader/res/cfw_hue_nobox.bmp:指定图标路径,且因文件名以_hue_nobox结尾,同时启用着色与去边框;
  • logopath=为可选的启动 logo(见 README_BOOTLOGO.md 的加载顺序:先logopath=,缺失/格式错误再回退bootloader/bootlogo.bmp,最后回退默认 hekate logo);
  • 键名前后不要留空格,条目内不要用#注释,以免解析失败(res/hekate_ipl_template.ini)。

若想让图标默认着色但不显示按钮底框,也可直接放bootloader/res/<entry_name>_hue_nobox.bmp,无需写icon=键——源码会按命名自动探测(nyx/nyx_gui/frontend/gui.c)。

排查清单与注意事项

  1. 背景不显示:确认路径为bootloader/res/background.bmp且是 1280×720、32 位含 Alpha 的 BMP;若导出成了 24 位 RGB,Alpha 通道丢失,表现会异常。
  2. 背景偏透明:32 位 BMP 的 Alpha 通道未填满,需要将 Alpha 设为0xFF以获得实底。
  3. 图标没生效:检查文件名是否与启动项名完全一致(大小写敏感),或icon=路径是否可访问;SD 卡挂载失败时会直接提示错误(参见 nyx/nyx_gui/nyx.c 的错误分支)。
  4. 着色没生效:确认文件名以_hue、_hue_nobox结尾(注意_hue判定要求文件名长度 > 8,_hue_nobox要求 > 14),且图标是白底透明线稿。
  5. 按钮框还在:_nobox只对单个图标生效;若混用了自定义背景,参考 nyx/nyx_gui/frontend/gui.c 中被注释掉的按钮透明逻辑,可知当前版本下_nobox是控制按钮底框的最直接方式。
  6. 修改后生效:无需重新编译 hekate/Nyx,重启进入 Nyx 即重新加载bootloader/res/下的资源。

结语

从 nyx/README_RES.md 出发,结合 nyx/nyx_gui/nyx.c 与 nyx/nyx_gui/frontend/gui.c 的源码逻辑,可以确认 Nyx 的定制体系非常“文件驱动”:背景图、默认图标、自定义图标与按条目命名的图标全部从bootloader/res/读取,icon=键提供最灵活的路径指定方式,_hue/_nobox/_hue_nobox三种后缀则精确控制着色与按钮底框。掌握这套规则后,制作一套风格统一、可复用的 Nyx 主题只需要准备好三样东西:一张 1280×720 的 ARGB 背景图、若干 192×192 的 ARGB 图标(其中可着色的做白底透明线稿),以及一条简洁的bootloader/hekate_ipl.ini配置。

  • 嵌入式
  • 固件
  • 系统编程

【免费下载链接】hekate

hekate - A GUI based Nintendo Switch Bootloader

项目地址:https://gitcode.com/gh_mirrors/he/hekate
点击查看免费下载

相关推荐

上一篇:告别缓存困扰:Chromeless clearCache/clearStorage 实战指南
下一篇:httpbin容器网络配置:Bridge与Host模式对比

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询