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

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

相关推荐
阿正的梦工坊8 小时前
【Rust】02-变量、不可变性与基础类型
开发语言·后端·rust
阿正的梦工坊9 小时前
【Rust】08-集合类型、字符串与迭代器入门
开发语言·rust·c#
阿正的梦工坊12 小时前
【Rust】09-泛型、Trait 与生命周期基础
开发语言·rust·c#
阿正的梦工坊12 小时前
【Rust】07-错误处理:Option、Result 与 ? 运算符
开发语言·算法·rust
Jurio.14 小时前
开源 Codex Sticky:在终端 Codex CLI 长对话中始终固定底部输入框
linux·rust·github·开源软件·codex·codex cli
阿正的梦工坊16 小时前
【Rust】04-借用、引用与切片
java·数据库·rust
福大大架构师每日一题16 小时前
2026年6月TIOBE编程语言排行榜,Go语言排名第13,Rust语言排名12。关于Rust已进入平台期的报道似乎为时过早。
开发语言·golang·rust
咸甜适中16 小时前
rust语言学习笔记Trait(十六)Error(错误)
笔记·学习·rust
guyoung16 小时前
BoxAgnts 工具系统(4)——Tool Trait 与并发上下文模型
rust·agent·ai编程
techdashen19 小时前
What is maintenance, anyway?
开发语言·后端·rust