夜航为什么是黑的:S-52 五套色板的逻辑
S-52 那篇提过一嘴:海图颜色不是 RGB 而是命名 token,一共 63 个,每 token 配五套色板(日间白底/黑底/亮底、黄昏、夜航)。当时没展开的是为什么——同一张海图,凭什么要五套颜色?把工具页里的真实色值拉出来对比一遍,答案就浮出来了。
先看数据。我们 S-52 色板速查页内嵌的色板数据里,日间白底板的平均亮度是 116(0-255),夜航板只有 24——差了近五倍。但"夜板 = 日板调暗"这个直觉完全不对,看三个真实 token 的旅程就明白:
| token | 语义 | Day 白底 | Night |
|---|---|---|---|
| DEPVS | 极浅水区 | #629acb(亮蓝) | #030413(近乎纯黑) |
| DEPMD | 中深水区 | #9eb5c0(浅灰蓝) | #070707 |
| CHBLK | 黑(线划/注记) | #070707 | #1f2223 |
极浅水从全图最扎眼的亮蓝变成几乎看不见的黑;深水也从浅灰蓝变成黑;唯独"黑"色本身反而变亮了一点。三行色值,三条设计逻辑。
一、夜航的人眼不是白天的人眼
白天看屏主要靠视锥细胞;夜航值班时切换到视杆细胞主导——而视杆细胞的暗适应极慢,完全适应需要半小时以上,一屏亮光就能让前功尽弃。更麻烦的是视杆细胞对蓝绿光最敏感(峰值波长约 500 nm),也就是说,白天最"醒目"的亮蓝色,恰恰是夜里杀伤暗适应的元凶。
所以 DEPVS 在夜板里被压到 #030413:浅水区的信息仍然在(等深线、注记都在),但它不再发光。夜板的设计目标不是"看清一切",而是"用最小的亮度差保住该看见的"。
二、夜里连"黑"都要重新定义
注意第三行:CHBLK 在夜板里是 #1f2223——比极浅水的 #030413 还亮。因为夜间注记和线划要保证可读,"黑色"的职责(描边、文字)要求它比水面背景亮一档;而水面背景的职责是隐身。
这暴露了 token 化的真正含义:"CHBLK"不是黑色,是"线划与注记用色"这个角色。角色不变,实现随场景变。谁要是以为 token 就是换了名字的十六进制,在夜板里直接用 #000000 画注记,得到的就是一张什么都看不清的图。
三、浅水和深水在夜里"合并"了
日板上,DEPVS(极浅)、DEPMS(中浅)、DEPMD(中深)、DEPIT(中间调)四个水深区色泾渭分明——白天靠色相就能扫出深浅分布。夜板里看数据:DEPVS 和 DEPMS 都是 #030413,DEPMD 是 #070707——浅水的层次在夜间主动放弃了,深浅之别改由等深线和注记承担。
这是色板设计里最值得学的一手:夜间显示的目标是"不引入新风险",细化到看不清程度的颜色区分不是资产是负债。做减法不是偷懒,是把信息挪到夜里更可靠的通道上。
亲手拖一下
这三条逻辑,我做成了一台可交互的 S-52 昼夜模拟器,一块合成海图按 look-up 表实时渲染:
- 切换白昼 / 黄昏 / 夜间,同一片水域当场换装——token 不变,整套色值替换
- 拖动安全等深线滑块,整片水域的填色立即重排:等深线是船员的设置,不是图的属性
- 盯着沉船的品红危险圈:安全等深线拉过它就亮起,拉离它就熄灭
三条设计逻辑,拖两分钟全部亲眼可见,比再看三千字都清楚。
五套色板,五种场景
- Day 白底 / Day 黑底 / Day 亮底:不同驾驶台环境和人眼偏好的三种日间实现
- Dusk 黄昏:晨昏蒙影时的过渡态,色值介于日夜之间(比如 CHBLK 的
#363c3d) - Night 夜航:上面说的暗视觉保护模式
切换不是换皮肤:软件要做的是按 token 系统整体换装,任何绘制代码里不允许出现具体色值——这条纪律在 S-52 那篇说过,这里补上数据层面的理由:五套板共 315 个色值(63×5),任何一个手滑硬编码,都会在某块屏幕、某个时段变成航海安全隐患。
全套五板的色值都内嵌在 S-52 颜色与符号速查里,点色块即可复制,改主题、做校准可以直接取用。
我是夜航海图,做海图与地图渲染开发的工程师。博客「航图笔记」同步更新全部文章,欢迎 RSS 订阅;如果内容帮到了你,也欢迎在爱发电请我喝杯咖啡。
♥ 这篇对你有用?在爱发电支持夜航海图——请我喝杯咖啡,工具和文章都会继续更新。
评论
评论基于 GitHub Discussions,需要 GitHub 账号;没有也欢迎通过 RSS 阅读器或各平台评论区交流。