基于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);
    }
}
相关推荐
对象存储与RustFS4 小时前
HelixDB 上手:Agent 记忆新方案,基于 RustFS 对象存储,附完整 docker-compose 部署示例
后端·rust·开源
Amos_Web4 小时前
Rspack 源码解析(二十):Typed Hook 系统如何靠宏生成
前端·rust·前端框架
Source.Liu5 小时前
【A11】拆分前端,实现多页面方案
前端·rust
Kapaseker6 小时前
别只会 unwrap():Rust Result 的几种实用写法
rust
DongQiShanRen18 小时前
玄龙(上):TICK 主循环——意识心跳怎么跳
linux·jvm·数据库·人工智能·数据挖掘·rust
编程序的员18 小时前
使用OpenTelemetry来监控Rust应用
运维·rust·monitoring·opentelemetry
对象存储与RustFS1 天前
JuiceFS + 对象存储:把 S3 变成 POSIX 文件系统实测
后端·rust·开源
遇码1 天前
侧边栏一开,AI 画的东西就被挡住了:给白板画布加「真实可见区」计算和相机补偿
人工智能·ai·rust
geovindu1 天前
rust: Borg Pattern(续)
开发语言·后端·设计模式·rust·博格模式
轻舟技术A2 天前
Pi 的 Rust 实现来了:rpi,不止一个终端 Agent
开发语言·后端·rust