colorgrad-rs

crates.io Documentation Build Status Build Status codecov

Rust color scales library for charts, maps, data-visualization and creative coding.

Index

Usage

Add colorgrad to your Cargo.toml toml [dependencies] colorgrad = "0.3.0"

Custom Gradient

Basic

rust let g = colorgrad::CustomGradient::new().build()?; img

Custom Colors

```rust use colorgrad::Color;

let g = colorgrad::CustomGradient::new() .colors(&[ Color::fromrgbu8(0, 206, 209), Color::fromrgbu8(255, 105, 180), Color::fromrgb(0.274, 0.5, 0.7), Color::fromhsv(50., 1., 1.), Color::from_hsv(348., 0.9, 0.8), ]) .build()?; ``` img

Using Web Color Format

.html_colors() method accepts named colors, hexadecimal (#rgb, #rgba, #rrggbb, #rrggbbaa), rgb(), rgba(), hsl(), hsla(), hwb(), and hsv().

rust let g = colorgrad::CustomGradient::new() .html_colors(&["#C41189", "#00BFFF", "#FFD700"]) .build()?; img

rust let g = colorgrad::CustomGradient::new() .html_colors(&["gold", "hotpink", "darkturquoise"]) .build()?; img

rust let g = colorgrad::CustomGradient::new() .html_colors(&["rgb(125,110,221)", "rgb(90%,45%,97%)", "hsl(229,79%,85%)"]) .build()?; img

Domain & Color Position

Default domain is [0..1].

```rust let g = colorgrad::CustomGradient::new() .html_colors(&["deeppink", "gold", "seagreen"]) .build()?;

assert_eq!(g.domain(), (0., 1.)); ``` img

Set the domain to [0..100].

```rust let g = colorgrad::CustomGradient::new() .html_colors(&["deeppink", "gold", "seagreen"]) .domain(&[0., 100.]) .build()?;

assert_eq!(g.domain(), (0., 100.)); ``` img

Set the domain to [-1..1].

```rust let g = colorgrad::CustomGradient::new() .html_colors(&["deeppink", "gold", "seagreen"]) .domain(&[-1., 1.]) .build()?;

assert_eq!(g.domain(), (-1., 1.)); ``` img

Set exact position for each color. The domain is [0..1].

```rust let g = colorgrad::CustomGradient::new() .html_colors(&["deeppink", "gold", "seagreen"]) .domain(&[0., 0.7, 1.]) .build()?;

assert_eq!(g.domain(), (0., 1.)); ``` img

Set exact position for each color. The domain is [15..80].

```rust let g = colorgrad::CustomGradient::new() .html_colors(&["deeppink", "gold", "seagreen"]) .domain(&[15., 30., 80.]) .build()?;

assert_eq!(g.domain(), (15., 80.)); ``` img

Blending Mode

rust let g = colorgrad::CustomGradient::new() .html_colors(&["#FFF", "#00F"]) .mode(colorgrad::BlendMode::Rgb) .build()?;

img

Preset Gradients

All preset gradients are in the domain [0..1]. Uniform B-splines is used to interpolate the colors.

img

Diverging

colorgrad::br_bg() img

colorgrad::pr_gn() img

colorgrad::pi_yg() img

colorgrad::pu_or() img

colorgrad::rd_bu() img

colorgrad::rd_gy() img

colorgrad::rd_yl_bu() img

colorgrad::rd_yl_gn() img

colorgrad::spectral() img

Sequential (Single Hue)

colorgrad::blues() img

colorgrad::greens() img

colorgrad::greys() img

colorgrad::oranges() img

colorgrad::purples() img

colorgrad::reds() img

Sequential (Multi-Hue)

colorgrad::turbo() img

colorgrad::viridis() img

colorgrad::inferno() img

colorgrad::magma() img

colorgrad::plasma() img

colorgrad::cividis() img

colorgrad::warm() img

colorgrad::cool() img

colorgrad::cubehelix_default() img

colorgrad::bu_gn() img

colorgrad::bu_pu() img

colorgrad::gn_bu() img

colorgrad::or_rd() img

colorgrad::pu_bu_gn() img

colorgrad::pu_bu() img

colorgrad::pu_rd() img

colorgrad::rd_pu() img

colorgrad::yl_gn_bu() img

colorgrad::yl_gn() img

colorgrad::yl_or_br() img

colorgrad::yl_or_rd() img

Cyclical

colorgrad::rainbow() img

colorgrad::sinebow() img

Using the Gradient

Get the domain

```rust let grad = colorgrad::rainbow();

assert_eq!(grad.domain(), (0., 1.)); ```

Get single color at certain position

```rust let grad = colorgrad::rainbow();

asserteq!(grad.at(0.0).rgbau8(), (110, 64, 170, 255)); asserteq!(grad.at(0.5).rgbau8(), (175, 240, 91, 255)); asserteq!(grad.at(1.0).rgbau8(), (110, 64, 170, 255)); ```

Get n colors evenly spaced across gradient

```rust let grad = colorgrad::rainbow();

for c in grad.colors(10) { println!("{}", c.tohexstring()); } ```

Output:

```console

6e40aa

c83dac

ff5375

ff8c38

c9d33a

7cf659

5dea8d

48b8d0

4775de

6e40aa

```

Hard-Edged Gradient

Convert gradient to hard-edged gradient with 11 segments and 0 smoothness.

rust let g = colorgrad::rainbow().sharp(11, 0.); img

This is the effect of different smoothness.

img

Examples

Gradient Image

```rust //extern crate colorgrad; //extern crate image;

use std::error::Error;

fn main() -> Result<(), Box> { let grad = colorgrad::CustomGradient::new() .html_colors(&["deeppink", "gold", "seagreen"]) .build()?;

let w = 1500;
let h = 70;
let fw = w as f64;

let mut imgbuf = image::ImageBuffer::new(w, h);

for (x, _y, pixel) in imgbuf.enumerate_pixels_mut() {
    let (r, g, b, _a) = grad.at(x as f64 / fw).rgba_u8();
    *pixel = image::Rgb([r, g, b]);
}

imgbuf.save("gradient.png")?;
Ok(())

} ```

Example output:

img

Colored Noise

```rust //extern crate colorgrad; //extern crate image; //extern crate noise;

use noise::NoiseFn;

fn main() { let w = 600; let h = 350; let scale = 0.015;

let grad = colorgrad::rainbow().sharp(5, 0.15);
let ns = noise::OpenSimplex::new();
let mut imgbuf = image::ImageBuffer::new(w, h);

for (x, y, pixel) in imgbuf.enumerate_pixels_mut() {
    let t = ns.get([x as f64 * scale, y as f64 * scale]);
    let (r, g, b, _a) = grad.at(remap(t, -0.5, 0.5, 0.0, 1.0)).rgba_u8();
    *pixel = image::Rgb([r, g, b]);
}
imgbuf.save("noise.png").unwrap();

}

// Map value which is in range [a, b] to range [c, d] fn remap(value: f64, a: f64, b: f64, c: f64, d: f64) -> f64 { (value - a) * ((d - c) / (b - a)) + c } ```

Example output:

img

Inspirations

Links