WezTerm Lua API 详解:`color:complement_ryb()` 与基于 RYB 色彩模型的补色计算
WezTerm Lua API 详解color:complement_ryb()与基于 RYB 色彩模型的补色计算【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm在 WezTerm 中通过 Lua 配置生成配色方案时常常需要根据一个基色自动推导出与之协调的对比色。color:complement_ryb()正是为此提供的核心方法它返回指定颜色的补色complement但与常规的 RGB 色环计算不同它走的是RYB红-黄-蓝色彩模型——也就是画家口中艺术家色轮artists color wheel的补色逻辑。读完本文你将掌握该方法的用法、它与color:complement()的差异、背后的色相换算算法以及如何把它用于程序化配色。方法签名与基本行为color:complement_ryb()返回值一个新的Color对象即当前颜色的 RYB 补色可用版本自 WezTerm20220807-113146-c2fee766版本起引入输入输出接受任意Color对象内部以 SRGBA 存储返回同样是 SRGBA 表示的Color对象。调用方必须是Color对象。Color 对象可以通过 wezterm.color.parse() 解析字符串得到也可能由 WezTerm 的各类函数与方法返回参见 Color 对象总览。local wezterm require(wezterm) local base wezterm.color.parse(red) -- 基色纯红 local comp base:complement_ryb() -- 基于 RYB 模型计算补色 wezterm.log_info(tostring(comp)) -- 输出补色的字符串表示从 Lua 绑定层面看该方法注册于 lua-api-crates/color-funcs/src/lib.rs 的ColorWrap用户数据类型中底层通过RgbaColor::complement_ryb()实现methods.add_method(complement_ryb, |_, this, _: ()| Ok(this.complement_ryb()));什么是 RYB 色彩模型RYBRed-Yellow-Blue红黄蓝是一种减色色彩模型历史上由画家在混合颜料时总结而成。它的三个原色是红、黄、蓝两两相混得到橙、绿、紫这三个二次色六者共同构成艺术家色轮。由于颜料混色的感知特性RYB 色环上相距 180° 的颜色在画家眼中往往比基于 RGB加法色色环的补色关系更自然、更协调。补充color:complement_ryb()使用 RYB 色彩模型其补色比 RGB 模型的补色更贴近艺术家对混合颜色的直觉。算法原理HSL 色相角度在 RGB 与 RYB 之间的双向映射原文档说明了整体流程转换为 HSL → 将色相角换算为对应的 RYB 角度 → 旋转 180° → 再换算回 RGB → 转回 RGBA。我们可以在 color-types/src/lib.rs 中找到完整的实现来印证这一过程。核心入口是SrgbaTuple::complement_ryb()它直接复用了adjust_hue_fixed_ryb(180.)pub fn complement_ryb(self) - Self { self.adjust_hue_fixed_ryb(180.) }而adjust_hue_fixed_ryb完整呈现了文档描述的四个步骤color-types/src/lib.rs#L608-L617pub fn adjust_hue_fixed_ryb(self, amount: f64) - Self { let (h, s, l, a) self.to_hsla(); // 1. 转 HSL let h rgb_hue_to_ryb_hue(h); // 2. RGB 色相角 → RYB 色相角 let h normalize_angle(h amount); // 3. 旋转 180°并归一化到 [0, 360) let h ryb_huge_to_rgb_hue(h); // 4. RYB 色相角 → RGB 色相角 Self::from_hsla(h, s, l, a) // 5. 用原饱和度/亮度重建 RGBA }注意旋转只改变色相饱和度S与明度L原样保留因此补色的明暗、鲜艳程度与基色保持一致只在对立的色相位置上。色相映射表分段线性换算RGB 与 RYB 的色相角并非简单线性对应WezTerm 采用分段线性映射。正方向rgb_hue_to_ryb_huecolor-types/src/lib.rs#L659-L675按 7 个区间换算RGB 色相区间°RYB 色相区间°0 – 350 – 6035 – 6060 – 12260 – 120122 – 165120 – 180165 – 218180 – 240218 – 275240 – 300275 – 330300 – 360330 – 360例如RGB 色环中红在 0°、黄在 60°而 RYB 色环中红被压缩到 0°、黄被推至 60°、绿大致对应 122° 附近……这套表在视觉上把画家直觉量化进了程序。逆变换ryb_huge_to_rgb_huecolor-types/src/lib.rs#L679-L695则执行完全相反的分段映射保证转过去再转回来不会破坏色相。每个区间内通过map_range做线性插值normalize_anglecolor-types/src/lib.rs#L705-L711负责把旋转后的角度收拢到[0°, 360°)从而支持负角度与超过 360° 的角度自动回绕。complement_ryb()与complement()的区别原文档特意指出它与 color:complement() 互为参考。两者的差异就在于旋转所基于的色环模型方法色相换算计算结果特点complement()直接在 HSL 色相角上加 180°color-types/src/lib.rs#L585-L587RGB 模型补色如红的补色偏向青色系complement_ryb()先换算到 RYB 角度旋转 180° 后再换回 RGBRYB 模型补色更贴近艺术家直觉如红的补色是绿色系以纯红#ff0000为例RGB 补色约为青色#00ffff色相 180°而 RYB 补色经映射后更接近绿色系。这正体现了两种色彩模型对补色的认知差异。实战把补色用于程序化配色complement_ryb()最常见的场景是在weztermLua 配置中程序化生成配色方案例如以主色调为基准自动推导前景色、强调色或分隔色local wezterm require(wezterm) -- 用主色调的 RYB 补色作为强调色保证视觉协调 local accent wezterm.color.from_hsla(210, 0.8, 0.6, 1.0) local accent_complement accent:complement_ryb() return { colors { accent tostring(accent_complement), }, }配合 wezterm.color.from_hsla()、color:adjust_hue_fixed_ryb() 等方法可以在不硬编码任何色值的前提下让整套配色随一个基准色自动衍生adjust_hue_fixed_ryb(180)得到补色与complement_ryb()等价triad()三个色相各隔 120°square()四个色相各隔 90°再用 color:saturate()、color:lighten() 等微调明度与饱和度即可生成完整的色板。小结color:complement_ryb()返回基于RYB 艺术家色轮的补色由 color-types/src/lib.rs 中adjust_hue_fixed_ryb(180.)实现算法本质是HSL 化 → RGB/RYB 色相分段线性互转 → 旋转 180° → 重建 RGBA需要严格颜色科学意义的补色时用 color:complement()需要画家直觉的协调色时用complement_ryb()它是 WezTerm 程序化生成配色方案Color 对象方法集中的重要一环适合在 Lua 配置中动态推导协调色。【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考