`:固定量降低明度)
WezTerm Lua 颜色变换之color:darken_fixed(amount)固定量降低明度【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm导读color:darken_fixed(amount)是 WezTerm 内建 LuaColor对象提供的颜色变换方法之一用于在保持色相与饱和度不变的前提下按固定数值降低颜色的明度lightness。它在程序化生成配色方案、为前景色搭配深色背景、以及批量调整终端颜色主题时非常实用。读完本文你将掌握该方法的参数语义、与darken(factor)的差异、底层 HSLA 实现原理以及可直接复制运行的 Lua 配置示例。方法速览darken_fixed是Color对象的一个方法该方法从 WezTerm 版本20220807-113146-c2fee766开始提供。其完整说明见仓库文档 docs/config/lua/color/darken_fixed.md。签名color:darken_fixed(amount)参数参数类型说明amountnumber明度降低量取值范围0.0到1.0表示在明度轴上按绝对值减少的幅度返回值返回一个新的Color对象原对象不会被修改因此可以链式调用其他颜色方法。Color对象由 wezterm.color.parse() 创建其方法列表可参见 Color 对象文档。一个最简示例local wezterm require wezterm local fg wezterm.color.parse #cccccc local bg fg:darken_fixed(0.8) -- 明度固定降低 0.8得到一个很深的灰色 return { colors { foreground fg, background bg, }, }固定量变暗与比例变暗darken_fixedvsdarkenWezTerm 同时提供了两种“变暗”方法语义差别在于对明度的作用方式二者容易混淆color:darken(factor)按比例scale向最低明度方向移动。factor为0.0时不变1.0时变为黑色中间值按“当前明度与 0 之间的差 × factor”计算因此同样的factor对浅色与深色的绝对影响不同。color:darken_fixed(amount)按固定绝对值fixed amount减少明度直接在当前明度上减去amount。这两组方法的文档分别位于 darken.md 与 lighten_fixed.md、lighten.md从中可以看到它们是一一对应的成对设计方法语义对应说明文档darken(factor)按比例向最低明度缩放darken.mddarken_fixed(amount)按固定量减少明度darken_fixed.mdlighten(factor)按比例向最高明度缩放lighten.mdlighten_fixed(amount)按固定量增加明度lighten_fixed.md从源码可以精确验证这两种算法的差异。核心数学逻辑定义在 color-types/src/lib.rsfn apply_scale(current: f64, factor: f64) - f64 { let difference if factor 0. { 1.0 - current } else { current }; let delta difference.max(0.) * factor; (current delta).max(0.) } fn apply_fixed(current: f64, amount: f64) - f64 { (current amount).max(0.) }apply_scale用于lighten/darken增量 目标方向的可达距离× factor效果随当前明度变化是相对缩放apply_fixed用于lighten_fixed/darken_fixed直接做current amount是绝对加减。因此darken_fixed(0.2)无论作用在明度0.9还是0.5的颜色上明度都固定减去0.2减到0为止而darken(0.2)则是“当前明度到黑色距离的 20%”。底层实现从 Lua 绑定到 HSLA 色彩空间Lua 方法绑定darken_fixed的 Lua 绑定定义在 lua-api-crates/color-funcs/src/lib.rs。可以看到它并非独立算法而是复用lighten_fixed并取负值实现的methods.add_method(lighten_fixed, |_, this, amount: f64| { Ok(this.lighten_fixed(amount)) }); methods.add_method(darken_fixed, |_, this, amount: f64| { Ok(this.lighten_fixed(-amount)) });也就是说color:darken_fixed(amount)等价于color:lighten_fixed(-amount)明度增加负值即变暗。ColorWrap内部对RgbaColor的包装见 lua-api-crates/color-funcs/src/lib.rs。HSLA 空间下的明度调整真正完成颜色变换的逻辑位于 color-types/src/lib.rs/// Lighten the color by amount, a value ranging from 0.0 to 1.0 #[cfg(feature std)] pub fn lighten_fixed(self, amount: f64) - Self { let (h, s, l, a) self.to_hsla(); let l apply_fixed(l, amount); Self::from_hsla(h, s, l, a) }实现要点先把颜色从 sRGB 转换到HSLA 色彩空间色相 h、饱和度 s、明度 l、透明度 a仅对明度分量l应用apply_fixed(l, amount)即(l amount).max(0.)再调用from_hsla转换回 sRGB 得到新颜色。由于色相h、饱和度s与透明度a全程原样保留所以darken_fixed只会改变明度不会造成色偏也不会影响透明通道——这正是它适合在配色方案中派生同色系深浅色的原因。边界行为apply_fixed只对结果做了下限截断.max(0.)。这意味着当amount使明度计算结果小于0时明度被钳制为0黑色文档规定amount的合法范围是0.0~1.0超出该范围虽不会导致运行时错误但会造成超出预期语义的明度变化例如大于1.0会直接压到黑色负值反而变亮因此应严格按文档范围传参。实战示例程序化生成配色方案Color对象方法的典型应用场景就是程序化生成颜色方案见 Color 对象文档 的说明。以下示例演示如何基于一个主色调用darken_fixed派生一整套深色背景与边框色local wezterm require wezterm local function scheme_from_base(hex) local base wezterm.color.parse(hex) return { background base:darken_fixed(0.7), -- 主背景明显加深 background_brightness base:darken_fixed(0.5), -- 稍亮的背景层 foreground base:lighten_fixed(0.4), -- 前景反方向提亮保证对比 } end local palette scheme_from_base #336699 return { color_scheme Builtin Solarized Dark, -- 可替换为自定义 colors 表 colors { background palette.background, foreground palette.foreground, }, }如果需要同时控制比例与绝对值还可以链式组合两类方法例如先按比例压暗再微调local bg wezterm.color.parse(#334466):darken(0.3):darken_fixed(0.05)这与官方示例文档 wezterm.color.parse() 中“计算前景色的补色后压暗用作背景色”的用法一脉相承该示例中使用的是complement_ryb():darken(0.2)将darken换成darken_fixed即可获得绝对值语义的变暗效果。注意事项小结darken_fixed自版本20220807-113146-c2fee766起可用旧版本配置若直接使用会报方法不存在amount取值范围为0.0~1.0本质是对 HSLA 明度分量的绝对减法减至0即黑色后不再继续变暗该方法不改变色相、饱和度与透明度可用于生成同色系深浅色而无需担心偏色Color对象不可变方法返回新对象适合链式调用与多次复用若希望变暗效果与当前颜色明度成比例浅色压得多、深色压得少请改用 darken(factor)。【免费下载链接】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),仅供参考