View Source Ultraviolet.Color (Ultraviolet v0.1.1)
functions related to parsing and generating Color structs for use elsewhere in Ultraviolet.
Color Spaces
Colors, by default, are stored in sRGB representation, but supports other
color spaces as input to new/4
and new/5
, where the last parameter is the
color space to translate from.
Available Spaces
- sRGB (the default):
:rgb
- HSL:
:hsl
- HSV / HSV:
:hsv
- CIE Lab:
:lab
- LCH:
:lch
,:hcl
- OKLab:
:oklab
- OKLCH:
:oklch
Other Scales
I may add these based on need in the future:
- GL (RGBA normalized to
0..1
) - CMYK
Summary
Types
Generic channel input for a color creation function.
Generic input for a color creation function.
The available color spaces for transformation, interpolation, and scales.
Defines the channels in an sRGB color.
Functions
Get the color opacity.
Set the color opacity.
Mixes several colors. If weights
are given, a weighted average is
calculated; the number of weights
must equal the number of colors.
Blends two colors using RGB channel-wise blend functions. See
Ultraviolet.blend/3
for examples and valid blend spaces.
Brighten a color.
Returns the CSS representation of an RGB color
Darken a color.
Decreases the saturation of a color by manipulating the Lch chromaticity.
Returns the hexadecimal representation of an RGB color.
Converts a Color to a different colorspace.
Mixes two colors. The mix weight
is a value between 0 and 1.
Generates a Color
from a hex string, W3CX11 specification color name,
integer, or channel tuple/map/list/keyword list.
Creates a new Color
from the given channels
and options
.
Increases the saturation of a color by manipulating the Lch chromaticity.
Produces a shade of the given color. This is syntactic sugar for mix/4
with a target color of black
.
Estimates the temperature of a given color, though this only makes sense for colors from the temperature gradient.
Produces a tint of the given color. This is syntactic sugar for mix/4
with a target color of white
.
Types
@type blend_mode() ::
:normal | :multiply | :darken | :lighten | :screen | :overlay | :burn | :dodge
Generic channel input for a color creation function.
Generic input for a color creation function.
@type space() :: :rgb | :lrgb | :hsl | :lab | :lch | :hcl | :oklab | :oklch
The available color spaces for transformation, interpolation, and scales.
@type space_t() :: t() | Ultraviolet.Color.HSL.t() | Ultraviolet.Color.HSV.t() | Ultraviolet.Color.Lab.t() | Ultraviolet.Color.LCH.t() | Ultraviolet.Color.OKLab.t() | Ultraviolet.Color.OKLCH.t()
Defines the channels in an sRGB color.
This is the core Ultraviolet structure. See Ultraviolet
for examples
of how it can be used.
Functions
Get the color opacity.
Examples
iex> {:ok, color} = Color.new("red");
iex> Color.alpha(color)
1.0
Set the color opacity.
Examples
iex> {:ok, color} = Color.new("red");
iex> Color.alpha(color, 0.5)
%Color{r: 255, g: 0, b: 0, a: 0.5}
Mixes several colors. If weights
are given, a weighted average is
calculated; the number of weights
must equal the number of colors.
See Ultraviolet.average/2
for documentation and examples.
@spec blend(t(), t(), blend_mode()) :: {:ok, t()} | {:error, term()}
Blends two colors using RGB channel-wise blend functions. See
Ultraviolet.blend/3
for examples and valid blend spaces.
Brighten a color.
Examples
iex> {:ok, color} = Color.new("hotpink");
iex> Color.hex(Color.brighten!(color))
"#ff9ce6"
iex> Color.hex(Color.brighten!(color, 2))
"#ffd1ff"
iex> Color.hex(Color.brighten!(color, 3))
"#ffffff"
Returns the CSS representation of an RGB color
Examples
iex>Color.css(%Color{})
"rgb(0 0 0)"
iex>Color.css(%Color{r: 255})
"rgb(255 0 0)"
iex>Color.css(%Color{r: 255, a: 0.5})
"rgb(255 0 0 / 0.5)"
Darken a color.
Examples
iex> {:ok, color} = Color.new("hotpink");
iex> Color.hex(Color.darken!(color))
"#c93384"
iex> Color.hex(Color.darken!(color, 2))
"#940058"
iex> Color.hex(Color.darken!(color, 2.6))
"#74003f"
Decreases the saturation of a color by manipulating the Lch chromaticity.
Examples
iex> {:ok, color} = Color.new("hotpink");
iex> Color.hex(Color.desaturate!(color))
"#e77dae"
iex> Color.hex(Color.desaturate!(color, 2))
"#cd8ca8"
iex> Color.hex(Color.desaturate!(color, 3))
"#b199a3"
Returns the hexadecimal representation of an RGB color.
Examples
iex>Color.hex(%Color{})
"#000000"
iex>Color.hex(%Color{r: 255})
"#ff0000"
iex>Color.hex(%Color{r: 255, a: 0.5})
"#ff000080"
You can also use to_string
to output this value
iex>to_string(%Color{r: 255, a: 0.5})
"#ff000080"
Converts a Color to a different colorspace.
Examples
HSL
iex>{:ok, color} = Ultraviolet.Color.new("#ff3399")
{:ok, %Ultraviolet.Color{r: 255, g: 51, b: 153}}
iex> Ultraviolet.Color.into(color, :hsl)
{:ok, %Ultraviolet.Color.HSL{h: 330, s: 1.0, l: 0.6}}
HSV / HSB
iex>{:ok, color} = Ultraviolet.Color.new("#ff3399")
{:ok, %Ultraviolet.Color{r: 255, g: 51, b: 153}}
iex> Ultraviolet.Color.into(color, :hsv)
{:ok, %Ultraviolet.Color.HSV{h: 330, s: 0.8, v: 1.0}}
Lab
iex>{:ok, color} = Ultraviolet.Color.new("hotpink")
{:ok, %Ultraviolet.Color{r: 255, g: 105, b: 180}}
iex> Ultraviolet.Color.into(color, :lab)
{:ok, %Ultraviolet.Color.Lab{l_: 65.49, a_: 64.24, b_: -10.65}}
iex> Ultraviolet.Color.into(color, :lab, reference: :f2)
{:ok, %Ultraviolet.Color.Lab{l_: 66.28, a_: 61.45, b_: -8.62}}
# try going the other way now
iex> Ultraviolet.new({66.28, 61.45, -8.62, 1.0}, space: :lab, reference: :f2)
{:ok, %Ultraviolet.Color{r: 255, g: 105, b: 180}}
iex> Ultraviolet.new(%{l_: 66.28, a_: 61.45, b_: -8.62}, space: :lab, reference: :f2)
{:ok, %Ultraviolet.Color{r: 255, g: 105, b: 180}}
iex> Ultraviolet.new({65.49, 64.24, -10.65, 1.0}, space: :lab)
{:ok, %Ultraviolet.Color{r: 255, g: 105, b: 180}}
LCH / HCL
iex>{:ok, color} = Ultraviolet.Color.new("#aad28c")
{:ok, %Ultraviolet.Color{r: 170, g: 210, b: 140, a: 1.0}}
iex> Ultraviolet.Color.into(color, :lch, round: 0)
{:ok, %Ultraviolet.Color.LCH{l: 80, c: 40, h: 130}}
iex> Ultraviolet.Color.into(color, :hcl, round: 0)
{:ok, %Ultraviolet.Color.LCH{l: 80, c: 40, h: 130}}
OKLab
iex>{:ok, color} = Ultraviolet.Color.new("#d9c500")
{:ok, %Ultraviolet.Color{r: 217, g: 197, b: 0, a: 1.0}}
iex> Ultraviolet.Color.into(color, :oklab, round: 2)
{:ok, %Ultraviolet.Color.OKLab{l_: 0.81, a_: -0.04, b_: 0.17}}
OKLCH
iex>{:ok, color} = Ultraviolet.Color.new("#aad28c")
{:ok, %Ultraviolet.Color{r: 170, g: 210, b: 140, a: 1.0}}
iex> Ultraviolet.Color.into(color, :oklch, round: 0)
{:ok, %Ultraviolet.Color.OKLCH{l: 1, c: 0, h: 132}}
iex> Ultraviolet.Color.into(color, :oklch, round: 1)
{:ok, %Ultraviolet.Color.OKLCH{l: 0.8, c: 0.1, h: 132.5}}
Mixes two colors. The mix weight
is a value between 0 and 1.
See Ultraviolet.mix/3
for documentation and examples.
Generates a Color
from a hex string, W3CX11 specification color name,
integer, or channel tuple/map/list/keyword list.
See Ultraviolet.new/1
for more details.
Creates a new Color
from the given channels
and options
.
See Ultraviolet.new/2
for more details.
Increases the saturation of a color by manipulating the Lch chromaticity.
Examples
iex> {:ok, color} = Color.new("slategray");
iex> Color.hex(Color.saturate!(color))
"#4b83ae"
iex> Color.hex(Color.saturate!(color, 2))
"#0087cd"
iex> Color.hex(Color.saturate!(color, 3))
"#008bec"
Produces a shade of the given color. This is syntactic sugar for mix/4
with a target color of black
.
Examples
iex>{:ok, color} = Color.new("hotpink");
iex> Color.hex(Color.shade!(color, ratio: 0.25))
"#dd5b9c"
iex> Color.hex(Color.shade!(color, ratio: 0.5))
"#b44a7f"
iex> Color.hex(Color.shade!(color, ratio: 0.75))
"#80355a"
Estimates the temperature of a given color, though this only makes sense for colors from the temperature gradient.
Examples
iex> {:ok, color} = Color.new("#ff3300");
iex> Color.temperature(color)
1000
iex> {:ok, color} = Color.new("#ff8a13");
iex> Color.temperature(color)
2000
iex> {:ok, color} = Color.new("#ffe3cd");
iex> Color.temperature(color)
4985
iex> {:ok, color} = Color.new("#cbdbff");
iex> Color.temperature(color)
10049
iex> {:ok, color} = Color.new("#b3ccff");
iex> Color.temperature(color)
15005
Produces a tint of the given color. This is syntactic sugar for mix/4
with a target color of white
.
Examples
iex>{:ok, color} = Color.new("hotpink");
iex> Color.hex(Color.tint!(color, ratio: 0.25))
"#ff9dc9"
iex> Color.hex(Color.tint!(color, ratio: 0.5))
"#ffc3dd"
iex> Color.hex(Color.tint!(color, ratio: 0.75))
"#ffe3ee"