基于rust的RGBA颜色混合

一般采用以下脚本。

rust 复制代码
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Pixel {
    pub r: u8,
    pub g: u8,
    pub b: u8,
    pub a: u8,
}

impl Pixel {
    pub fn blend(p1: Pixel, p2: Pixel) -> Pixel {
        let a1 = p1.a as u32;
        let a2 = p2.a as u32;

        let a3 = a2 + (a1 * (255 - a2) >> 8);
        let x = a3 - a1;

        let r = ((p1.r as u32 * a1 + p2.r as u32 * x) / a3) as u8;
        let g = ((p1.g as u32 * a1 + p2.g as u32 * x) / a3) as u8;
        let b = ((p1.b as u32 * a1 + p2.b as u32 * x) / a3) as u8;
        let a = a3 as u8;

        Pixel { r, g, b, a }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn basic() {
        let p1 = Pixel { r: 255, g: 0, b: 0, a: 128 };
        let p2 = Pixel { r: 0, g: 255, b: 0, a: 255 };
        let blended = Pixel::blend(p1, p2);
        println!("{:?}", blended);
    }
}

若透明像素较多,考虑以下脚本。

rust 复制代码
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Pixel {
    pub r: u8,
    pub g: u8,
    pub b: u8,
    pub a: u8,
}

impl Pixel {
    pub fn blend(p1: Pixel, p2: Pixel) -> Pixel {
        let a1 = p1.a as u32;
        let a2 = p2.a as u32;

        if a1 == 0 { return p2; }
        if a2 == 0 { return p1; }

        let a3 = a2 + (a1 * (255 - a2) >> 8);
        let x = a3 - a1;

        let r = ((p1.r as u32 * a1 + p2.r as u32 * x) / a3) as u8;
        let g = ((p1.g as u32 * a1 + p2.g as u32 * x) / a3) as u8;
        let b = ((p1.b as u32 * a1 + p2.b as u32 * x) / a3) as u8;
        let a = a3 as u8;

        Pixel { r, g, b, a }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn basic() {
        let p1 = Pixel { r: 255, g: 0, b: 0, a: 128 };
        let p2 = Pixel { r: 0, g: 255, b: 0, a: 255 };
        let blended = Pixel::blend(p1, p2);
        println!("{:?}", blended);
    }
}
相关推荐
迷藏4949 小时前
# 发散创新:用 Rust实现高性能测试框架的底层逻辑与实战演练
java·开发语言·后端·python·rust
迷藏49412 小时前
**发散创新:用 Rust实现高效共识算法——从 Raft到自研轻量级协议的实战演进**
java·开发语言·rust·共识算法
anzhxu12 小时前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
Rust研习社1 天前
深入理解 Rust 的所有权、借用和生命周期
rust
Rust研习社1 天前
深入浅出生命周期:认识生命周期
rust
小杍随笔1 天前
【Rust 语言编程知识与应用:元编程详解】
开发语言·后端·rust
希夷小道1 天前
gitru:一个由 Rust 打造的零依赖 Git 提交信息校验工具
git·rust
Ivanqhz1 天前
linearize:控制流图(CFG)转换为线性指令序列
开发语言·c++·后端·算法·rust
集智飞行1 天前
安装rust和cargo
开发语言·后端·rust