当前位置: 首页 > backend >正文

基于rust的RGBA颜色混合

一般采用以下脚本。

#[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);}
}

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

#[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);}
}
http://www.xdnf.cn/news/17135.html

相关文章:

  • Qt: WA_DontCreateNativeAncestors
  • 【音视频】WebRTC C++ native 编译
  • B-树与B+树
  • 行业应用案例:MCP在不同垂直领域的落地实践
  • Java 中 Object 类的解析:知识点与注意事项
  • PPT漏斗图,让数据更美观!
  • 表驱动法-灵活编程范式
  • P4568 [JLOI2011] 飞行路线
  • 全面解析 URL 重定向原理:从协议、实现到安全实践
  • Plant Biotechnol J(IF=10.5)|DAP-seq助力揭示葡萄白粉病抗性机制
  • 普通冷库如何升级物联网冷库?工业智能网关赋能冷链智能化转型
  • C 语言主控开发与显控开发能力体系及技术栈详解,STM32、QT、嵌入式、边缘系统显示
  • LINUX-文件查看技巧,重定向以及内容追加,man及echo的使用
  • Next.js 15 重磅发布:React 19 集成 + 性能革命,开发者必看新特性指南
  • Dokcer创建中间件环境
  • PHP MySQL Delete 操作详解
  • JSON、JSONObject、JSONArray详细介绍及其应用方式
  • TypeScript 元组类型精简知识点
  • mysql死锁的常用解决办法
  • 【面试场景题】电商秒杀系统的库存管理设计实战
  • 应急响应知识总结
  • centos KVM
  • git 清理submodule
  • Webpack核心技能:Webpack安装配置与模块化
  • 【YOLOv8改进 - C2f融合】C2f融合DBlock(Decoder Block):解码器块,去模糊和提升图像清晰度
  • C语言中的进程、线程与进程间通信详解
  • 前端UI组件库
  • XXL-JOB快速入门
  • 【数据分享】西藏土壤类型数据库
  • imx6ull-驱动开发篇11——gpio子系统