当前位置: 首页 > news >正文

【学Rust写CAD】36 颜色插值函数(alpha256.rs补充方法)

源码

pub fn alpha_lerp(self,src: Argb, dst: Argb, clip: u32) -> Argb {
        self.alpha_mul_256(clip).lerp(src, dst)
    }

这个函数 alpha_lerp 是一个颜色插值(线性插值,lerp)函数,它结合了透明度混合(alpha_mul_256)和颜色插值(lerp),用于计算两个颜色 src 和 dst 的混合结果,其中混合比例由 self(透明度)和 clip(裁剪值)共同决定。

参数:
  • self:一个 Alpha256 类型的值,表示透明度 alpha256,范围是 [0, 256]。

  • src:源颜色,类型为 Argb(通常表示带 Alpha 通道的 RGBA 颜色)。

  • dst:目标颜色,类型为 Argb。

  • clip:一个 u32 值,用于调整混合比例,范围是 [0, 255] 。

返回值:
  • 返回一个 Argb,表示混合后的颜色值。

计算步骤:

  1. self.alpha_mul_256(clip):
  • 调用 alpha_mul_256 方法,计算 (clip * alpha256) / 255,得到一个 Alpha256 类型的混合比例。

  • 这个比例用于后续的颜色插值。

  1. .lerp(src, dst):
  • 使用上一步计算的比例,对 src 和 dst 进行线性插值(lerp)。

  • lerp 的公式通常是 src * (1 - t) + dst * t,其中 t 是混合比例(Alpha256 的值归一化到 [0, 1])。

作用:
  • 这个函数主要用于颜色混合,例如:

    • 在图形渲染中,将一个半透明的颜色 src 叠加到背景颜色 dst 上。

    • 在 UI 绘制中,实现渐变或淡入淡出效果。

  • clip 参数可以进一步控制混合比例(例如,用于裁剪效果)。

  • self 用于遮罩效果

示例:

假设:

  • self.0 = 128(alpha256 = 128,半透明)。

  • clip = 255(最大值)。

  • src = Argb(0xFFFF0000)(红色,完全不透明)。

  • dst = Argb(0xFF0000FF)(蓝色,完全不透明)。

计算过程:

  1. alpha_mul_256(255):
  • prod = 255 * 128 = 32640。

  • (prod + (prod >> 8)) >> 8 = (32640 + 127) >> 8 = 32767 >> 8 = 127。

  • 返回 Alpha256(127)(即 t ≈ 127 / 256 ≈ 0.496)。

  1. lerp(src, dst):
  • 对 src 和 dst 的每个通道(A、R、G、B)进行插值:

    • 红色通道:0xFF * (1 - 0.496) + 0x00 * 0.496 ≈ 0x80。
  • 蓝色通道:0x00 * (1 - 0.496) + 0xFF * 0.496 ≈ 0x80。

  • 最终混合颜色可能是 Argb(0xFF808080)(灰色)。

总结:

alpha_lerp 是一个高效的透明度混合函数,结合了 alpha_mul_256 和 lerp,适用于图形渲染、颜色混合等场景。它通过整数运算避免了浮点计算,同时保持较高的精度。

相关文章:

  • Vue3实战二、搭建Vue3+ElementPlus项目教程
  • Scala 转义字符
  • AI赋能ArcGIS Pro——水系网络AI智能提取 | GIS人工智能制图技术解析
  • 洛谷 P3367 【模板】并查集 C++
  • [原创](Modern C++)现代C++的关键性概念: std::move()可以理解为把数据进行剪切再粘贴.
  • BGP路由协议之解决 IBGP 水平分割带来的问题
  • 【Tauri2】016——后端Invoke结构体和invoke_key
  • opus+ffmpeg+c++实现录音
  • Windwos的DNS解析命令nslookup
  • Linux系统的不同发行版的常用命令
  • 大储EMS能量管理系统解决方案:助力企业实现智慧能源转型
  • SSM框架相关面试题
  • Vue3实战七、登录认证与退出登录
  • Spring AOP 核心的技术之一:动态代理
  • 其他合成方式介绍
  • nacos集群部署
  • 【redis】summary
  • rust 同时处理多个异步任务,并在一个任务完成退出
  • PythonJSON解析如何优雅处理嵌套JSON字符串
  • springboot中使用async实现异步编程
  • 哈马斯官员:若实现永久停火,可交出加沙地带控制权
  • 警方通报男子广州南站持刀伤人:造成1人受伤,嫌疑人被控制
  • 不是10点!乌克兰官员称尚未就俄乌谈判开始时间达成一致
  • 江西贵溪:铜板上雕出的国潮美学
  • 跨文化戏剧的拓荒者与传承者——洪深与复旦剧社的百年回响
  • 大外交|巴西总统卢拉第六次访华签署20项协议,“双方都视对方为机遇”