基于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);
    }
}
相关推荐
Yeauty4 小时前
用 Whisper 转录前,你不用再离开 Rust
开发语言·rust·ffmpeg·音视频·视频
程序员爱钓鱼4 小时前
Rust HashMap 详解:键值存储、查询、更新与统计
后端·面试·rust
doiito18 小时前
【AI 应用】从“外国人味”到地道中文:kokoroi-rs v0.1.2 架构升级深度解析
ai·rust·系统设计
Zwarwolf1 天前
Rust零散知识点项目汇总
开发语言·rust
X档案库1 天前
【开源】我做了一套可以 AI 托管的 Markdown 博客与知识库
rust·博客·markdown·marksharex
程序员爱钓鱼1 天前
Rust Vec 动态数组详解:创建、增删、遍历与排序
前端·后端·rust
_abab1 天前
Rust重塑系统编程:从Linux内核到AI推理引擎的2026全景解析
linux·人工智能·rust
doiito2 天前
【Agent Harness】Gliding Horse 高级认知优化:让 Agent 的“大脑”和“免疫系统”真正协同
ai·rust·架构设计·系统设计·ai agent
longxiangam2 天前
第 4 篇:Embassy 异步运行时与事件驱动架构
单片机·嵌入式硬件·rust
程序员爱钓鱼2 天前
Rust String 与 &str 详解:字符串所有权、借用与转换
前端·后端·rust