Rust颜色处理库colorsys的使用,支持RGB、HSL、HSV等多种颜色模型的转换与操作
Rust颜色处理库colorsys的使用,支持RGB、HSL、HSV等多种颜色模型的转换与操作
一个用Rust编写的颜色转换和变异的模块。 目前支持以下颜色模型:
- RGB(a)(也支持十六进制)
- HSL(a)
- CMYK(a)
- ANSI256代码
它能做什么
getters & setters
use colorsys::{Rgb, Hsl, ColorAlpha};
let rgb = Rgb::from((57.3, 12.7, 53.0));
let r = rgb.red();
// 57.3
let mut hsl = Hsl::default();
// Hsl { h: 0, s: 0, l: 0, a: 1 }
hsl.set_saturation(13.98);
hsl.set_saturation(305.71);
hsl.set_alpha(0.75);
// Hsl { h: 305.71, s: 13.98, l: 0, a: 0.75 }
conversion
查看文档中的From/FromStr/Into
特性实现以获取更多信息
use colorsys::{Rgb, Hsl};
let rbga_tuple = (57.3, 12.7, 53.0, 0.33);
let rgba = Rgb::from(&rbga_tuple);
let hsla: Hsl = rgba.as_ref().into();
// ~Hsl { h: 305.78, s: 63.71, l: 13.73, a: 0.33 }
let rgb_arr: [u8; 3] = Rgb::from(&hsla).into();
// ~[57, 13, 53]
let hsla_tuple: (f64,f64,f64,f64) = Hsl::from( Rgb::from(rgb_tuple) ).into();
// ~Hsl { h: 305.78, s: 63.71, l: 13.73, a: 1 }
let hex: String = rgba.to_hex_string();
// #390d35
//
// From/Into
//
let rgb1 = Rgb::from_hex_str("37ea4c").unwrap();
let rgb2 = Rgb::from(
Into::<[f32; 4]>::into(Rgb::from(
Into::<[u8; 3]>::into(
Rgb::from(
Into::<(i32,i32,i32)>::into(
Rgb::from(
Into::<[i64; 3]>::into(&rgb1)
)
)
)
)
))
);
assert_eq!(rgb1, rgb2);
//
// Ratio
//
use colorsys::{RgbRatio, ApproxEq};
let blue = Rgb::from([34, 111, 235]);
let ratio: [f32; 4] = blue.as_ratio().into();
// ~[0.133, 0.435, 0.922, 1.0]
let converted: Rgb = RgbRatio::from(&ratio).into();
assert!(blue.approx_eq_clarify(&converted, 0.0001));
modification
查看文档中的ColorTransform/Add*/Sub*..
特性以获取更多信息
use colorsys::{Hsl, Rgb, ColorTransform,ColorAlpha, SaturationInSpace};
let mut rgb: Rgb = (245.0,152.0,53.0).into();
rgb.lighten(20.1);
// ~Rgb { r: 249.83, g: 201.80, b: 150.67 }
rgb.opacify(-0.7);
rgb.saturate( SaturationInSpace::Hsl(-35.7) );
// ~Rgb { r: 230.29, g: 201.19, b: 170.21, a: 0.3 }
rgb.grayscale_simple();
// ~Rgb { r: 200.255, g: 200.255, b: 200.255, a: 0.3 }
let mut hsl = Hsl::from(&rgb);
hsl.opacify(1.0);
// ~Hsl { h: 0.0, s: 0.0, l: 78.53 }
hsl.adjust_hue(231.99);
hsl.saturate(SaturationInSpace::Hsl(55.7));
let mut rgb2: Rgb = hsl.as_ref().into();
// ~Rgb { r: 169.76, g: 177.9, b: 230.75}
rgb2.invert();
// ~Rgb { r: 85.24, g: 77.09, b: 24.25 }
let rgb3 = rgb - rgb2;
// ~Rgb { r: 115.01, g: 123.16, b: 176.0 }
let hsl2 = hsl + rgb3.into();
// ~Hsl { h: 0.0, s: 83.55, l: 100.0 }
parsing from string & css string representation
use colorsys::{Hsl, Rgb};
use std::str::FromStr;
let s = "rgb(177, 255, 176)";
let rgb: Rgb = s.parse().unwrap();
rgb.to_css_string();
// String: "rgb(177,255,176)"
rgb.to_hex_string();
// #b1ffb0
Hsl::from_str("hsl(168, 52%, 42%)").unwrap().to_css_string();
// String: hsl(168,52%,42%)
no_std
该crate有一个名为"std"
的Cargo特性,默认启用。
要在no_std
上下文中使用colorsys
,需要禁用此特性。
修改您的依赖项以选择退出默认启用的特性。
[dependencies]
colorsys = { version = "*", default-features = false }
颜色单位范围
所有颜色单位都是f64。以下是它们的范围:
- red: 0.0 - 255.0
- green: 0.0 - 255.0
- blue: 0.0 - 255.0
- hue: 0.0 - 360.0
- saturation: 0.0 - 100.0
- lightness: 0.0 - 100.0
- cmyk中的所有值都是: 0.0 - 100.0
- alpha: 0.0 - 1.0
- ansi256代码是
u8
如果您指定的值不在这些范围内,它们将被替换为最小值或最大值。
享受使用!
完整示例代码
use colorsys::{Rgb, Hsl, ColorAlpha, ColorTransform, SaturationInSpace};
use std::str::FromStr;
fn main() {
// 创建RGB颜色
let rgb = Rgb::from((57.3, 12.7, 53.0));
println!("RGB颜色: {:?}", rgb);
// 获取红色分量
let r = rgb.red();
println!("红色分量: {}", r);
// 创建HSL颜色并设置属性
let mut hsl = Hsl::default();
hsl.set_hue(305.71);
hsl.set_saturation(13.98);
hsl.set_lightness(50.0);
hsl.set_alpha(0.75);
println!("HSL颜色: {:?}", hsl);
// 颜色转换
let rgba_tuple = (57.3, 12.7, 53.0, 0.33);
let rgba = Rgb::from(&rgba_tuple);
let hsla: Hsl = rgba.as_ref().into();
println!("RGB转HSL: {:?}", hsla);
// 转换为十六进制
let hex: String = rgba.to_hex_string();
println!("十六进制: {}", hex);
// 从字符串解析
let s = "rgb(177, 255, 176)";
let rgb_from_str: Rgb = s.parse().unwrap();
println!("从字符串解析: {:?}", rgb_from_str);
// CSS字符串表示
println!("CSS字符串: {}", rgb_from_str.to_css_string());
// 颜色操作
let mut rgb_oper: Rgb = (245.0, 152.0, 53.0).into();
rgb_oper.lighten(20.1);
println!("变亮后的RGB: {:?}", rgb_oper);
// 饱和度调整
rgb_oper.saturate(SaturationInSpace::Hsl(-35.7));
println!("调整饱和度后的RGB: {:?}", rgb_oper);
}
1 回复