#color-conversion #color #rgb #convert-hex #convert #hsl #hsv

easy_color

一个非常简单且易于使用的颜色转换工具

14个版本

0.1.13 2023年7月28日
0.1.12 2023年7月26日
0.1.11 2023年5月11日
0.1.6 2023年4月29日

#215 in 算法

Download history 15/week @ 2024-03-11 21/week @ 2024-03-18 23/week @ 2024-04-01 1/week @ 2024-04-08 7/week @ 2024-04-22 17/week @ 2024-04-29 25/week @ 2024-05-06 28/week @ 2024-05-13 37/week @ 2024-05-20 26/week @ 2024-05-27 45/week @ 2024-06-03 36/week @ 2024-06-10 36/week @ 2024-06-17 42/week @ 2024-06-24

162 每月下载量
用于 2 crates

MIT/Apache

56KB
1.5K SLoC

这是一个非常简单且易于使用的颜色转换工具,可以轻松地在十六进制、RGB、RGBA、HSL、HSLA、HSV和CMYK之间转换颜色。每种类型都有其独特的API,例如RGB可以设置颜色通道,RGBA可以设置透明度,HSL可以设置色调、饱和度和亮度等。

   use easy_color::{RGBA, RGB, HSL, Hex, ColorMix};
   use crate::easy_color::{IntoRGB, IntoHex, IntoRGBA, IntoHSL, IntoHSLA, IntoHSV, IntoCMYK};

   let hex:Hex = "#2bc48a".try_into().unwrap();
   
   let mut rgb:RGB = hex.into();
   // or
   let mut rgb = hex.to_rgb();
   assert_eq!(rgb.to_string(), "rgb(43,196,138)");
   rgb.set_red(255);
   assert_eq!(rgb.to_string(), "rgb(255,196,138)");
   
   let mut rgba:RGBA = rgb.into();
   // or
   let mut rgba = rgb.to_rgba();
   rgba.set_alpha(0.5);
   assert_eq!(rgba.to_string(), "rgba(255,196,138,0.50)");
   
   let mut hsl:HSL = rgba.into();
   // or
   let mut hsl = rgba.to_hsl();
   hsl.set_hue(240);
   assert_eq!(hsl.to_string(), "hsl(240,100%,88%)");
   
   let hex:Hex = hsl.into();
   // or
   let hex = hsl.to_hex();
   assert_eq!(hex.to_string(), "#C2C1FF");

   // mix two color
   let hsl:HSL = (0,0,0).try_into().unwrap();
   let rgba:RGBA = (255,255,255,1.0).try_into().unwrap();
   rgba.mix(hsl, None).to_string(); // rgba(127,127,127,1.00)
   rgba.mix(hsl, Some(0.35)).to_string(); // rgba(165,165,165,1.00)//!
   hsl.mix(rgba, None).to_string(); // hsl(0,0%,50%)

   rgba.is_dark(); // false
   rgba.is_light(); // true
   rgba.fade(0.5); // rgba(255,255,255, 0.5)

   // creat random color
   let rgb = RGB::random();
   let rgba = RGBA::random();
   let hsl = HSL::random();

   let hex:Hex = "#2bc48a".try_into().unwrap();
   let hex_str = hex.to_rgb().set_blue(255).to_hsl().set_lightness(50).to_cmyk().set_cyan(100).to_hex().to_string(); // #00B5FF

十六进制

   let _hex:Hex = "#FAC".try_into().unwrap(); 
   let _hex:Hex = "#FFDFAC".try_into().unwrap();
   let _hex:Hex = "#FFDFACDC".try_into().unwrap() // hex with transparency

   let rgba:RGBA = "rgba(255,223,172,0.85)".try_into().unwrap();
   let hex:Hex = rgba.into();
   let hex_str = hex.to_hex_alpha();
   assert_eq!(hex_str, "#FFDFACD8");

   let hex_str2 = hex.to_alpha_hex();
   assert_eq!(hex_str, "#D8FFDFAC");

将十六进制转换为其他类型,例如

   let hex:Hex = "#FFDFAC".try_into().unwrap();
   let rgb:RGB = hex.into();
   assert_eq!(rgb.to_string(), "rgb(255,223,172)");

   let _hsl:HSL = hex.into();
   let _rgba:RGBA = hex.into();
   let _hsla:HSLA = hex.into();
   let _hsv:HSV = hex.into();
   let _cmyk:CMYK = hex.into();

RGB

RGB可以从格式为"rgb(r,g,b)"的字符串或从元组(r,g,b)中解析

  • r:u8 - 红色值(0~255)
  • g:u8 - 绿色值(0~255)
  • b:u8 - 蓝色值(0~255)
    let mut rgb:RGB = "rgb(43,196,138)".try_into().unwrap();
    rgb.set_green(255);
    assert_eq!(rgb.to_string(), "rgb(43,255,138)");

    let rgb:RGB = (43, 196, 138).try_into().unwrap();
    assert_eq!(rgb.to_string(), "rgb(43,196,138)");
    let hex:Hex = rgb.into();
    assert_eq!(hex.to_string(), "#2BC48A");

    let _rgba:RGBA = rgb.into();
    let _hsl:HSL = rgb.into();
    let _hsla:HSLA = rgb.into();
    let _hsv:HSV = rgb.into();
    let _cmyk:CMYK = rgb.into();

RGBA

RGBA可以从格式为"rgba(r,g,b,a)"的字符串或从元组(r,g,b,a)中解析

  • r:u8 - 红色值(0~255)
  • g:u8 - 绿色值(0~255)
  • b:u8 - 蓝色值(0~255)
  • a:f32 - 透明度(0~1)
    let mut rgba:RGBA = "rgba(125,60,98,0.8)".try_into().unwrap();
    rgba.set_alpha(0.5);
    assert_eq!(rgba.to_string(), "rgba(125,60,98,0.50)");

    let rgba:RGBA = (125,60,240,0.5).try_into().unwrap();
    let hsl:HSL = rgba.into();
    assert_eq!(hsl.to_string(), "hsl(262,85%,79%)");

它还可以转换为其他类型。

HSL

HSL可以从格式为"hsl(h, s%, l%)"的字符串或从元组(h,s,l)中解析

  • h:u32 - 色调(0~360)
  • s:u32 - 饱和度(0~100)
  • l:u32 - 亮度(0~100)
    let mut hsl:HSL = "hsl(262,85%,79%)".try_into().unwrap();
    hsl.set_lightness(50);
    assert_eq!(hsl.to_string(), "hsl(262,85%,50%)");

    let hsl:HSL = (125,60,75).try_into().unwrap();
    let rgb:RGB = hsl.into();
    assert_eq!(rgb.to_string(), "rgb(153,229,159)")

HSLA

HSLA可以从格式为"hsla(h, s%, l%, a)"的字符串或从元组(h,s,l,a)中解析

  • h:u32 - 色调(0~360)
  • s:u32 - 饱和度(0~100)
  • l:u32 - 亮度(0~100)
  • a:f32 - 透明度(0~1)
    let mut hsla:HSLA = "hsla(262,85%,79%, 0.7)".try_into().unwrap();
    hsla.set_alpha(0.5);
    assert_eq!(hsla.to_string(), "hsla(262,85%,79%,0.50)");

    let hsla:HSLA = (125,60,75,0.6).try_into().unwrap();
    let rgba:RGBA = hsla.into();
    assert_eq!(rgba.to_string(), "rgba(153,229,159,0.60)");

HSV

HSV可以从格式为"hsl(h, s%, v%)"的字符串或从元组(h,s,v)中解析。

  • h:u32 - 色调(0~360)
  • s:u32 - 饱和度(0~100)
  • v:u32 - 价值(0~100)
    use easy_color::{RGB, HSV};
    let mut hsv:HSV = "hsv(262,85%,79%)".try_into().unwrap();
    hsv.set_value(50);
    assert_eq!(hsv.to_string(), "hsv(262,85%,50%)");

    let hsv:HSV = (125,60,75).try_into().unwrap();
    assert_eq!(hsv.to_rgb().to_string(), "rgb(76,191,86)");

CMYK

CMYK可以从格式为"cmyk(c,m,y,k)"的字符串或从元组(c,m,y,k)中解析。

  • c:u8 - 青色值(0~100)
  • m:u8 - 品红色值(0~100)
  • y:u8 - 黄色值(0~100)
  • k:u8 - 黑色值(0~100)
    use easy_color::{Hex, CMYK};
    let mut cmyk:CMYK = "cmyk(77,34,53,38)".try_into().unwrap();
    cmyk.set_cyan(100);
    assert_eq!(cmyk.to_string(), "cmyk(100,34,53,38)");

    let cmyk:CMYK = (100,34,53,38).try_into().unwrap();
    assert_eq!(cmyk.to_hex().to_string(), "#00684A");

方法

每种结构类型都有以下方法

    fn is_dark(&self) -> bool;
    fn is_light(&self) -> bool;
    fn grayscale(&self) -> Self; 
    fn negate(&self) -> Self;
    fn mix(&self, other:T, weight:Option<f32>) -> Self;
    fn darken(&mut self, ratio:f32) -> Self;
    fn lighten(&mut self, ratio:f32) -> Self;

依赖项

~310KB