【学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 Web 开发实战:使用 SQLx 连接 PostgreSQL 数据库
后端·rust·github
Moonbit1 天前
MoonBit Pearls Vol.05: 函数式里的依赖注入:Reader Monad
后端·rust·编程语言
Vallelonga1 天前
Rust 异步中的 Waker
经验分享·rust·异步·底层
m0_480502642 天前
Rust 入门 KV存储HashMap (十七)
java·开发语言·rust
Include everything2 天前
Rust学习笔记(三)|所有权机制 Ownership
笔记·学习·rust
码码哈哈爱分享2 天前
Tauri 框架介绍
css·rust·vue·html
寻月隐君3 天前
硬核实战:从零到一,用 Rust 和 Axum 构建高性能聊天服务后端
后端·rust·github
m0_480502643 天前
Rust 入门 泛型和特征-特征对象 (十四)
开发语言·后端·rust
RustFS3 天前
如何用 Rust 对 RustFS MCP Server 进行扩展?
rust
我是前端小学生5 天前
一文梳理Rust语言中的可变结构体实例
rust