【学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))。

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

相关推荐
a cool fish(无名)9 小时前
rust-方法语法
开发语言·后端·rust
a cool fish(无名)1 天前
rust-参考与借用
java·前端·rust
叶 落1 天前
[Rust 基础课程]猜数字游戏-获取用户输入并打印
rust·rust基础
RustFS1 天前
RustFS 如何修改默认密码?
rust
景天科技苑1 天前
【Rust线程池】如何构建Rust线程池、Rayon线程池用法详细解析
开发语言·后端·rust·线程池·rayon·rust线程池·rayon线程池
该用户已不存在2 天前
Zig想要取代Go和Rust,它有资格吗
前端·后端·rust
用户1774125612442 天前
不懂装懂的AI,折了程序员的阳寿
rust
量子位3 天前
vivo自研蓝河操作系统内核开源!Rust开发新机遇来了
rust·ai编程
祈澈菇凉3 天前
rust嵌入式开发零基础入门教程(六)
stm32·单片机·rust
祈澈菇凉3 天前
rust嵌入式开发零基础入门教程(二)
开发语言·后端·rust