基于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);
    }
}
相关推荐
Vallelonga2 小时前
关于 Rust 异步(无栈协程)的相关疑问
开发语言·后端·rust
q567315232 小时前
Rust爬虫与代理池技术解析
开发语言·爬虫·python·rust
RustFS4 小时前
如何用 Trae + RustFS MCP 实现自然语言对对象存储的操作?
rust·trae
咸甜适中18 小时前
Rust语言序列化和反序列化vec<u8>,serde库Serialize, Deserialize,bincode库(2025年最新解决方案详细使用)
开发语言·后端·rust
受之以蒙1 天前
web-sys进阶:事件处理、异步操作与 Web API 实践
笔记·rust·webassembly
寻月隐君1 天前
Rust NFT 开发实战:构建生产级的 Pinata IPFS 自动化上传工具
后端·rust·github
Maer091 天前
【Rust】多级目录模块化集成测试——以Cucumber为例
服务器·rust·集成测试
盛夏绽放2 天前
SassSCSS:让CSS拥有超能力的预处理器
前端·css·rust
我不是李.杨2 天前
解决 npm i node-sass@4.12.0 安装失败异常 npm i node-sass异常解决
rust·npm·sass