【学Rust写CAD】30 Alpha256结构体补充方法(alpha256.rs)

源码

rust 复制代码
impl Alpha256 {
    #[inline]
    pub fn alpha_mul(&self, x: u32) -> u32 {
        let mask = 0xFF00FF;

        let src_rb = ((x & mask) * self.0) >> 8;
        let src_ag = ((x >> 8) & mask) * self.0;

        (src_rb & mask) | (src_ag & !mask)
    }
}

代码分析

功能
  • 输入:

    • x:32 位像素值(通常格式为 0xAARRGGBB 或 0xRRGGBBAA)。
  • self:Alpha256 实例,存储 alpha 值(范围 [1, 256])。

  • 输出:

    • 返回 x 的每个颜色通道(R、G、B)乘以 alpha / 255 后的新像素值(A 通道未处理)。
计算步骤
  1. 掩码 mask = 0xFF00FF:
  • 用于提取 红色(R) 和 蓝色(B) 通道(0x00RR00BB 格式)。

  • 例如,x & mask 得到 0x00RR00BB,(x >> 8) & mask 得到 0x00AA00GG。

  1. 计算 src_rb(R 和 B 通道的 alpha 乘法):
rust 复制代码
let src_rb = ((x & mask) * self.0) >> 8;
  • x & mask:提取 R 和 B 分量(0x00RR00BB)。

    • self.0:乘以 alpha(范围 [1, 256])。
  • 8:相当于除以 256(近似 alpha / 255)。

  1. 计算 src_ag(A 和 G 通道的 alpha 乘法):
rust 复制代码
let src_ag = ((x >> 8) & mask) * self.0;
  • x >> 8:右移 8 位,使 A 和 G 通道对齐到低位(0x00AA00GG)。

  • & mask:再次提取 A 和 G(避免高位干扰)。

    • self.0:乘以 alpha(但尚未右移 8 位)。
  1. 组合结果:
rust 复制代码
(src_rb & mask) | (src_ag & !mask)
  • src_rb & mask:保留 R 和 B 通道(0x00RR00BB)。

  • src_ag & !mask:保留 A 和 G 通道的高 8 位(0xAA00GG00)。

|:合并 R+B 和 A+G,得到最终像素值。

  1. 为什么这样计算?
优化技巧
  • 并行计算:

    • 同时处理 R+B 和 A+G 通道,减少指令依赖,提高性能。
  • 近似除以 255:

    • (x * alpha) >> 8 近似于 (x * alpha) / 255(因为 256 ≈ 255)。

    • 误差极小(最大误差 0.4%),在图形处理中可以接受。

适用场景

  • 图像合成(如 blend = src * alpha + dst * (1 - alpha))。

  • 颜色调整(如调整透明度或亮度)。

相关推荐
寻月隐君3 小时前
深入解析 Rust 的面向对象编程:特性、实现与设计模式
后端·rust·github
KENYCHEN奉孝1 天前
基于 actix-web 框架的简单 demo
前端·rust
love530love1 天前
【笔记】旧版MSYS2 环境中 Rust 升级问题及解决过程
开发语言·人工智能·windows·笔记·python·rust·virtualenv
Humbunklung1 天前
Rust 函数
开发语言·后端·rust
荣江1 天前
【实战】基于 Tauri 和 Rust 实现基于无头浏览器的高可用网页抓取
后端·rust
susnm1 天前
创建你的第一个 Dioxus app
rust·全栈
大腾智能1 天前
点击启动「高效模式」:大腾智能 CAD 重构研发设计生产力
cad·工业软件·工业数字化·工业设计协同
love530love2 天前
【笔记】在 MSYS2(MINGW64)中正确安装 Rust
运维·开发语言·人工智能·windows·笔记·python·rust
景天科技苑2 天前
【Rust宏编程】Rust有关宏编程底层原理解析与应用实战
开发语言·后端·rust·rust宏·宏编程·rust宏编程
维维酱2 天前
Rust - 消息传递
rust