渐变刚甩掉「灰廊」,就被 OKLCH 裁出硬边:sRGB / HSL / OKLCH 三条插值路径的实测复盘
在 canvas 或 shader 里做一条红到青的渐变如果直接对 RGB 三个通道做线性插值中间大概率会出现一段脏兮兮的灰棕色。前端圈子里「用 OKLCH」几乎成了标准答案——它确实能让渐变保持鲜艳。但我对 5 组互补色对跑了 100 步实测后发现一个反直觉的结论OKLCH 路径平均有 48.7% 的插值步会越出 sRGB 色域直接截断就会产生硬边。灰廊是被赶走了硬边又住进来了。这篇文章不站队。我只把 sRGB、HSL、OKLCH 三条插值路径放在同一把尺子上量一量看它们分别在「灰廊深度」「色相绕路」「色域裁剪」三个维度上表现如何。背景做渐变时我们到底在插什么颜色插值不是把两个十六进制字符串平均一下那么简单。你选的色空间本质上是在给中间色规定一条路径。sRGB把两个颜色当成 RGB 三维空间里的点直接拉直线。这条线很容易穿过色立方中心附近于是红到青的中点会冲到(128,128,128)这种灰褐色。HSL先把端点转到色相-饱和度-亮度圆柱再分别插值。它绕开了灰廊但色相是按角度走的最短弧经常要经过一个你根本没选的第三色。OKLCH在感知均匀的 OKLab 柱坐标里插值。它保证路径最短、亮度均匀代价是这条感知直线经常穿出 sRGB 这个小色域。大多数开发者对 sRGB 的灰廊有痛感对 HSL 的色相绕路不太敏感对 OKLCH 的色域裁剪几乎没概念。下面我把三种路径都实现了一遍用同一组数据说话。三种插值路径的实现与观察我挑了生成艺术和 UI 里最常见的 5 组互补/近互补色对红→青、蓝→橙、品红→绿、紫→黄、粉→青蓝。每种色对分别用 sRGB、HSL、OKLCH 插 100 步再统一转回 sRGB 显示。图1红→青在三种插值空间下的路径对比。sRGB 中点发灰HSL 绕路穿过品红OKLCH 走最短感知路径并保鲜艳。只看图 1 就能读出三个关键现象sRGB 红→青的中点明显发灰HSL 虽然鲜艳但路径从红拐到品红再到青蓝完全不是「最短路径」OKLCH 看起来最自然红与青之间的过渡饱满均匀。但这只是肉眼。我们要把「灰廊深度」「色相绕路」「色域裁剪」量化出来。实证一最小感知色度 C灰廊深度我把每条路径上的中间颜色再统一转到 OKLCH读取其色度C。C越低说明路径上最灰的那一步越接近灰廊。结果如下色对sRGB 最小 CHSL 最小 COKLCH 最小 C红→青0.0440.1680.133蓝→橙0.0230.2150.156品红→绿0.0610.1520.189紫→黄0.0880.1700.125粉→青蓝0.0680.1740.122平均最小 CsRGB ≈ 0.057HSL ≈ 0.176OKLCH ≈ 0.145。图2五条色对的最小感知色度 C 对比。sRGB红几乎贴着 0HSL黄与 OKLCH绿都保持在 0.12 以上。sRGB 在互补色渐变里几乎必然制造灰廊这是 RGB 立方几何决定的。HSL 和 OKLCH 都能把最小 C 拉到 0.12 以上视觉上不再发灰。实证二色相绕路度数HSL 的谎言HSL 保鲜艳的代价是色相绕路。我把每条路径上每一步的 OKLCH 色相累加得到路径实际穿越的色相总跨度色对sRGB 色相跨度HSL 色相跨度OKLCH 色相跨度红→青154.8°134.8°0.1°蓝→橙188.3°135.8°3.0°品红→绿129.6°115.6°1.0°紫→黄142.4°133.3°13.0°粉→青蓝145.2°137.8°0.1°HSL 平均绕路约 131°OKLCH 平均不到 4°。这意味着用 HSL 做「红→青」渐变浏览器会替你悄悄经过品红做「蓝→橙」渐变会经过紫和红。如果你的品牌或数据语义要求严格控制过渡色HSL 这个自动绕路就是 bug而不是特性。实证三OKLCH 的越界裁剪率OKLCH 的麻烦不在灰廊而在色域。它描述的是一个比 sRGB 大得多的感知空间一条感知直线从 sRGB 内的一点走到另一点很容易穿出 sRGB 的边界。我把每条 OKLCH 路径上越出[0,1]的 RGB 采样点比例算了出来色对OKLCH 越界比例红→青0%蓝→橙35%品红→绿45%紫→黄66%粉→青蓝0%平均越界比例 48.7%。图3OKLCH 路径越出 sRGB 色域的比例。紫→黄高达 66%不做 gamut 映射直接截断会出现明显硬边。越界本身不是错误但你如果在 canvas 或 shader 里 naive 地把r/g/b截断到[0,1]那些越界采样点会被拍扁到色域边界上形成肉眼可见的硬边。CSSlinear-gradient(in oklch, ...)浏览器会自动做 gamut 映射所以网页渐变里不明显可一旦你手写 OKLCH 插值并自己转回 RGB这就是必须处理的坑。局限与落地建议这套实测只覆盖 sRGB 端点没碰 P3、Rec.2020 等广色域也没测试不同 gamut 映射算法clip、chroma 缩减、L 保持对视觉的影响。但它足够说明选色空间不是「哪个更好」而是「你愿意为哪种副作用买单」。落地建议网页 CSS 渐变直接用linear-gradient(in oklch, ...)浏览器会帮你处理色域映射风险最低。canvas / WebGL / 自写算法如果手动做 OKLCH 插值务必加 gamut 映射比如迭代降低 chroma 直到 RGB 回退到[0,1]而不是简单截断。色相相近的端点比如蓝→紫HSL 绕路不严重计算又比 OKLCH 轻完全可以继续用。互补/近互补端点避开 sRGB 线性插值如果性能敏感且不需要精确感知路径HSL 是折中方案。结论与下一步三种插值路径都守恒但守恒的不是同一个东西sRGB 守恒的是 RGB 三个通道的算术平均代价是灰廊HSL 守恒的是色相弧长与饱和度代价是绕路OKLCH 守恒的是感知距离代价是色域裁剪。没有银弹。如果你在写生成艺术、数据可视化或设计系统值得把这条判断写进项目规范互补色渐变用 OKLCH gamut 映射邻近色用 HSLsRGB 插值只作为兜底 fallback。开源地址结论段指向同一组织即可3 个矩阵门户https://github.com/wangzifan396-wzf/WB单文件工具聚合器https://github.com/wangzifan396-wzf/nano-workbenchGitHub 组织主页wangzifan396-wzf (WangZi) · GitHub

相关新闻

AI抠图失效的7个隐藏原因(GPU显存陷阱、边缘抗锯齿错配、Alpha通道溢出…)——一线CV工程师深度复盘

AI抠图失效的7个隐藏原因(GPU显存陷阱、边缘抗锯齿错配、Alpha通道溢出…)——一线CV工程师深度复盘

更多请点击: https://intelliparadigm.com 第一章:AI抠图失效的底层机理与现象诊断 AI抠图模型在实际应用中频繁出现边缘撕裂、半透明区域丢失、发丝粘连背景等异常,其根本原因并非单纯的数据量不足,而是深层的感知-决策耦合失配…

2026/10/4 21:39:07 阅读更多 →
P2G与碳捕集技术在热电联供系统中的应用与优化

P2G与碳捕集技术在热电联供系统中的应用与优化

1. 项目背景与核心价值在能源结构转型的大背景下,如何实现高碳能源系统的低碳化运行已成为行业痛点。传统热电联供系统虽然能效较高,但碳排放强度大,难以满足日益严格的环保要求。这个项目正是针对这一矛盾点,创新性地将P2G&#…

2026/9/28 17:32:29 阅读更多 →
10分钟快速部署wvp-GB28181-pro:免费开源的国标视频监控平台完整教程

10分钟快速部署wvp-GB28181-pro:免费开源的国标视频监控平台完整教程

10分钟快速部署wvp-GB28181-pro:免费开源的国标视频监控平台完整教程 【免费下载链接】wvp-GB28181-pro 基于GB28181-2016、部标808、部标1078标准实现的开箱即用的网络视频平台。自带管理页面,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、…

2026/10/3 6:11:05 阅读更多 →

最新新闻

控制即推断:用变分推断与KL散度重构最优控制与MPC

控制即推断:用变分推断与KL散度重构最优控制与MPC

1. 从“控制”到“推断”:一个视角的转换第一次接触Control as Inference这个概念,是在啃一本强化学习的专著时。当时我正在做一个机械臂抓取的项目,用传统的MPC(模型预测控制)框架调参调得头大——代价函数里的权重稍…

2026/10/4 21:38:50 阅读更多 →
SAP S4 HANA COPA获利能力分析:从配置到月结实操指南

SAP S4 HANA COPA获利能力分析:从配置到月结实操指南

很多刚接触SAP ERP的朋友,尤其是一上来就面对SAP S4 HANA项目的人,经常会问同一个问题:FICO到底在学什么?COPA又是什么?为什么顾问嘴里动不动就蹦出一串事务代码,比如MD07、KO88、KE30,每个都像…

2026/10/4 21:38:50 阅读更多 →
ClawFeed的下一步:从AI信息摘要到Agent友好基础设施(MCP、Webhook与多渠道推送前瞻)

ClawFeed的下一步:从AI信息摘要到Agent友好基础设施(MCP、Webhook与多渠道推送前瞻)

ClawFeed的下一步:从AI信息摘要到Agent友好基础设施(MCP、Webhook与多渠道推送前瞻) 【免费下载链接】clawfeed ClawFeed — AI-powered news digest with structured summaries from Twitter/RSS feeds and web dashboard 项目地址: https…

2026/10/4 21:38:49 阅读更多 →
ARMxy工业控制器:重构PLC/网关/工控机三层架构

ARMxy工业控制器:重构PLC/网关/工控机三层架构

1. 为什么工业现场突然开始谈论“ARMxy”——它真能一口吞掉PLC、网关和工控机?最近在几个储能项目现场调试时,我连续三次被客户指着控制柜问:“你们这台小盒子,是不是把PLC、网关、工控机全干掉了?”——说的就是ARMx…

2026/10/4 21:38:49 阅读更多 →
OpenShell完全指南:替换Windows开始菜单,找回习惯的操作体验

OpenShell完全指南:替换Windows开始菜单,找回习惯的操作体验

重装系统后第一个要抢救回来的工具,对我来说不是浏览器也不是输入法,而是 OpenShell。这个免费开源项目从 Classic Shell 一路改名到 Open-Shell,目标始终没有变:把 Windows 系统里越来越难用的开始菜单,换成一套你自己…

2026/10/4 21:38:49 阅读更多 →
kordoc公文生成引擎:从Markdown一键生成HWPX,9种preset·表格·公式·图表全解

kordoc公文生成引擎:从Markdown一键生成HWPX,9种preset·表格·公式·图表全解

kordoc公文生成引擎:从Markdown一键生成HWPX,9种preset表格公式图表全解 【免费下载链接】kordoc 모두 파싱해버리겠다 — HWPHWPXPDFOffice 문서를 Markdown으로. 양식 자동 채우기와 신구대조를 갖춘 CLIMCP 서버 | Convert Korean documents (HWP, HW…

2026/10/4 21:37:48 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →