Rust CSS颜色处理库css-color的使用,支持高效解析、转换和操作CSS颜色值
Rust CSS颜色处理库css-color的使用,支持高效解析、转换和操作CSS颜色值
功能概述
css-color库用于解析来自CSS Color Module Level 4的颜色字符串。支持所有传统的sRGB格式:
- RGB十六进制表示法
rgb()
和rgba()
函数hsl()
和hsla()
函数hwb()
函数- 命名颜色(包括
transparent
关键字)
还支持none
关键字。"缺失"的颜色组件行为与零相同。
安装使用
首先,在Cargo.toml
中添加依赖:
[dependencies]
css-color = "0.2.8"
示例代码
以下是内容中提供的示例:
use css_color::Srgb;
fn main() {
let lime = Srgb::new(0., 1., 0., 1.);
assert_eq!(lime, "#0f0".parse().unwrap());
assert_eq!(lime, "rgb(0 255 0)".parse().unwrap());
assert_eq!(lime, "rgb(0% 100% 0%)".parse().unwrap());
assert_eq!(lime, "hsl(120deg 100% 50% / 100%)".parse().unwrap());
assert_eq!(lime, "hwb(120 0% 0% / 1)".parse().unwrap());
assert_eq!(lime, "lime".parse().unwrap());
}
完整示例
以下是一个更完整的示例,展示如何使用css-color库进行颜色解析、转换和操作:
use css_color::{Srgb, Rgba, Hsl, Hwb, ParseError};
fn main() -> Result<(), ParseError> {
// 1. 解析不同格式的颜色
let hex_color: Srgb = "#ff0000".parse()?; // 红色
let rgb_color: Srgb = "rgb(255, 0, 0)".parse()?;
let rgba_color: Rgba = "rgba(255, 0, 0, 0.5)".parse()?;
let hsl_color: Hsl = "hsl(120, 100%, 50%)".parse()?; // 绿色
let hwb_color: Hwb = "hwb(240 0% 0%)".parse()?; // 蓝色
let named_color: Srgb = "blue".parse()?;
// 2. 颜色转换
let hsl_from_rgb: Hsl = hex_color.into();
let rgb_from_hsl: Srgb = hsl_color.into();
// 3. 颜色操作
let mut color = Srgb::new(1.0, 0.0, 0.0, 1.0); // 红色
color.green = 1.0; // 现在变为黄色
// 4. 格式验证
match "invalid_color".parse::<Srgb>() {
Ok(_) => println!("Valid color"),
Err(e) => println!("Invalid color: {}", e),
}
// 5. 透明度处理
let transparent = Rgba::new(1.0, 0.0, 0.0, 0.5); // 半透明红色
let fully_transparent: Rgba = "transparent".parse()?;
Ok(())
}
支持的Rust版本
最低支持的Rust版本是1.55。早期版本可能可以编译,但解析可能会拒绝某些有效的数值。
许可证
该仓库采用以下任一许可证:
- Apache License, Version 2.0
- MIT license
贡献
除非您明确声明,否则根据Apache-2.0许可证,您有意提交的任何贡献均应按照上述方式获得双重许可,不附加任何其他条款或条件。
1 回复
Rust CSS颜色处理库css-color使用指南
css-color
是一个用于解析、转换和操作CSS颜色值的Rust库,它支持CSS Color Module Level 4规范中的各种颜色格式和功能。
安装
在Cargo.toml中添加依赖:
[dependencies]
css-color = "0.3"
基本用法
解析CSS颜色字符串
use css_color::Color;
fn main() {
// 解析十六进制颜色
let hex_color = Color::from_hex("#1a2b3c").unwrap();
println!("{:?}", hex_color); // Rgba(Rgba { red: 26, green: 43, blue: 60, alpha: 1.0 })
// 解析rgb/rgba颜色
let rgb_color = Color::from_str("rgb(255, 128, 0)").unwrap();
println!("{:?}", rgb_color);
// 解析hsl颜色
let hsl_color = Color::from_str("hsl(120, 100%, 50%)").unwrap();
println!("{:?}", hsl_color);
// 解析颜色名称
let named_color = Color::from_str("rebeccapurple").unwrap();
println!("{:?}", named_color);
}
颜色转换
use css_color::Color;
fn main() {
let color = Color::from_hex("#ff0000").unwrap();
// 转换为HSL
let hsl = color.to_hsl();
println!("HSL: {:?}", hsl); // Hsl(Hsl { hue: 0.0, saturation: 1.0, lightness: 0.5, alpha: 1.0 })
// 转换为RGB
let rgb = color.to_rgb();
println!("RGB: {:?}", rgb); // Rgba(Rgba { red: 255, green: 0, blue: 0, alpha: 1.0 })
// 转换为十六进制字符串
let hex = color.to_hex_string();
println!("Hex: {}", hex); // #ff0000
}
颜色操作
use css_color::{Color, Rgba};
fn main() {
let mut color = Color::from_str("rgba(255, 0, 0, 0.5)").unwrap();
// 修改透明度
color.set_alpha(0.8);
println!("New alpha: {}", color.alpha()); // 0.8
// 变亮/变暗
if let Color::Rgba(rgba) = color {
let lighter = rgba.lighten(0.1); // 变亮10%
let darker = rgba.darken(0.1); // 变暗10%
println!("Lighter: {:?}", lighter);
println!("Darker: {:?}", darker);
}
// 混合颜色
let red = Color::from_str("red").unwrap();
let blue = Color::from_str("blue").unwrap();
let purple = red.mix(&blue, 0.5); // 50%混合
println!("Purple: {:?}", purple); // Rgba(Rgba { red: 128, green: 0, blue: 128, alpha: 1.0 })
}
高级功能
支持CSS Color Level 4新特性
use css_color::Color;
fn main() {
// 支持新的颜色函数
let lab_color = Color::from_str("lab(56.29% -10.93 16.58)").unwrap();
println!("Lab color: {:?}", lab_color);
let lch_color = Color::from_str("lch(56.29% 19.86 123.76)").unwrap();
println!("LCH color: {:?}", lch_color);
// 支持颜色空间转换
if let Color::Lab(lab) = lab_color {
let xyz = lab.to_xyz();
println!("XYZ: {:?}", xyz);
}
}
序列化和反序列化
use css_color::Color;
use serde_json;
fn main() {
let color = Color::from_str("hsl(120, 100%, 50%)").unwrap();
// 序列化为JSON
let json = serde_json::to_string(&color).unwrap();
println!("JSON: {}", json); // {"Hsl":{"hue":120.0,"saturation":1.0,"lightness":0.5,"alpha":1.0}}
// 从JSON反序列化
let deserialized: Color = serde_json::from_str(&json).unwrap();
println!("Deserialized: {:?}", deserialized);
}
完整示例代码
use css_color::{Color, Rgba};
use serde_json;
fn main() {
// 1. 解析各种格式的颜色
println!("=== 颜色解析示例 ===");
let colors = [
"#1a2b3c", // 十六进制
"rgb(255, 128, 0)", // RGB
"hsl(120, 100%, 50%)", // HSL
"rebeccapurple", // 颜色名称
"rgba(255, 0, 0, 0.5)", // RGBA
"lab(56.29% -10.93 16.58)", // Lab
"lch(56.29% 19.86 123.76)" // LCH
];
for color_str in colors {
match Color::from_str(color_str) {
Ok(color) => println!("'{}' => {:?}", color_str, color),
Err(e) => println!("解析'{}'失败: {}", color_str, e),
}
}
// 2. 颜色转换演示
println!("\n=== 颜色转换示例 ===");
let red = Color::from_hex("#ff0000").unwrap();
println!("原始颜色: {:?}", red);
println!("转换为HSL: {:?}", red.to_hsl());
println!("转换为RGB: {:?}", red.to_rgb());
println!("十六进制表示: {}", red.to_hex_string());
// 3. 颜色操作演示
println!("\n=== 颜色操作示例 ===");
let mut semi_red = Color::from_str("rgba(255, 0, 0, 0.5)").unwrap();
// 修改透明度
semi_red.set_alpha(0.8);
println!("修改透明度后: {:?}", semi_red);
// 变亮/变暗
if let Color::Rgba(rgba) = semi_red {
println!("变亮10%: {:?}", rgba.lighten(0.1));
println!("变暗10%: {:?}", rgba.darken(0.1));
}
// 颜色混合
let blue = Color::from_str("blue").unwrap();
println!("红色和蓝色混合: {:?}", semi_red.mix(&blue, 0.5));
// 4. 序列化演示
println!("\n=== 序列化示例 ===");
let hsl_color = Color::from_str("hsl(120, 100%, 50%)").unwrap();
let json = serde_json::to_string(&hsl_color).unwrap();
println!("序列化为JSON: {}", json);
let decoded: Color = serde_json::from_str(&json).unwrap();
println!("从JSON解码: {:?}", decoded);
}
性能特点
css-color
库经过优化,具有以下性能特点:
- 零拷贝解析:直接从字符串解析为内部表示,无需中间分配
- 快速转换:颜色空间转换使用优化的数学运算
- 最小化内存占用:使用紧凑的内部表示
注意事项
- 颜色解析严格遵循CSS规范,无效的颜色字符串会返回错误
- 某些高级颜色空间(如Lab、LCH)可能在某些转换中精度有限
- 颜色操作(如变亮/变暗)基于特定算法,可能与CSS滤镜效果略有不同
这个库非常适合需要处理CSS颜色值的Rust应用,如网页渲染引擎、设计工具或样式处理器。