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

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

相关推荐
柯南46682 小时前
【AI开发之Rust】第 20 课:壳侧 API 封装 —— 把 Rust 能力接进真实 UI
rust·编程语言
Yunovian5 小时前
AI时代,针对模型与应用,浅谈一下各编程语言
开发语言·c++·人工智能·python·ai·rust·ai编程
Kapaseker7 小时前
Rust 凭什么不用垃圾回收?先搞懂 Owner
rust
Amos_Web8 小时前
Rspack 源码解析(十五):Loader Runner 与 JS Loader 桥接
前端·rust·前端框架
柯南466815 小时前
【AI开发之Rust】第 18 课:SQLite 持久化与本地缓存 —— 给 store 填上真实现
rust·编程语言
柯南466815 小时前
【AI开发之Rust】第 17 课:项目总览与核心架构 —— AI 助手 Rust 核心从 0 到 1
rust·编程语言
柯南466815 小时前
【AI开发之Rust】第 16 课:FFI 手写绑定与内存布局 —— 把 Rust 交给别的语言
rust·编程语言
达子66615 小时前
RUST 图解 第 2 章:写小游戏
rust
Amos_Web15 小时前
Rspack 源码解析(十四):Resolver 与 NormalModuleFactory
前端·rust·源码
Kapaseker15 小时前
秒懂 Rust 的 7 个核心概念
rust