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库经过优化,具有以下性能特点:

  • 零拷贝解析:直接从字符串解析为内部表示,无需中间分配
  • 快速转换:颜色空间转换使用优化的数学运算
  • 最小化内存占用:使用紧凑的内部表示

注意事项

  1. 颜色解析严格遵循CSS规范,无效的颜色字符串会返回错误
  2. 某些高级颜色空间(如Lab、LCH)可能在某些转换中精度有限
  3. 颜色操作(如变亮/变暗)基于特定算法,可能与CSS滤镜效果略有不同

这个库非常适合需要处理CSS颜色值的Rust应用,如网页渲染引擎、设计工具或样式处理器。

回到顶部