Chameleon (chameleon v2.5.0) View Source
Chameleon is a utility that converts colors from one model to another. It currently supports: Hex, RGB, CMYK, HSL, HSV, Pantone, and Keywords.
Use
Chameleon represents colors using Elixir structs. Create a color using one of the provided structs:
iex> Chameleon.RGB.new(255, 0, 0)
%Chameleon.RGB{b: 0, g: 0, r: 255}
Once you have a color, Chameleon can convert that color to another colorspace or format:
iex> Chameleon.RGB.new(255, 0, 0) |> Chameleon.convert(Chameleon.HSV)
%Chameleon.HSV{h: 0, s: 100, v: 100}
iex> Chameleon.RGB.new(255, 0, 0) |> Chameleon.convert(Chameleon.Hex)
%Chameleon.Hex{hex: "FF0000"}
Chameleon can also convert strings:
iex> Chameleon.convert("#ff0000", Chameleon.RGB)
%Chameleon.RGB{b: 0, g: 0, r: 255}
iex> Chameleon.convert("red", Chameleon.CMYK)
%Chameleon.CMYK{c: 0, k: 0, m: 100, y: 100}
If Chameleon doesn't know how to convert the color, you'll get an error:
iex> Chameleon.convert("#112233", Chameleon.Pantone)
{:error, "No pantone match could be found for that color value."}
Adding color types
Chameleon uses Elixir protocols internally to perform the conversions. This makes it possible to add support for new colorspaces and formats in your own code. To do this, first create a struct for your color:
defmodule MyApp.FancyColor do
@enforce_keys [:c1, :c2, :c3]
defstruct @enforce_keys
def new(c1, c2, c3), do: %__MODULE__{c1: c1, c2: c2, c3: c3}
end
Next, implement the color protocol. Your color can implement as many or as few color space protocols as you need. For example:
defimpl Chameleon.Color.RGB do
def from(your_color_struct), do: MyApp.FancyColor.to_rgb(your_color_struct)
end
When Chameleon doesn't find a direct conversion from one color to another, it will attempt to convert through RGB. By supporting RGB conversions, your color type will be convertible between many color types. Of course, color conversion is frequently a lossy operation and you may want to implement more conversion modules.
Caveat(s)
Pantone is designed to be used on printed work only. As such, it is disingenuous to say a pantone value can be translated to a hex value since hex values will look different depending on the device displaying them. However, if you have a pantone value and want to find a device-displayable analog, this library will work.
Link to this section Summary
Functions
Handles conversion from the input color struct to the requested output color model.
Link to this section Functions
Handles conversion from the input color struct to the requested output color model.
Examples
iex> input = Chameleon.Hex.new("000000")
iex> Chameleon.convert(input, Chameleon.Color.Keyword)
%Chameleon.Keyword{keyword: "black"}
iex> input = Chameleon.Keyword.new("black")
iex> Chameleon.convert(input, Chameleon.Color.CMYK)
%Chameleon.CMYK{c: 0, m: 0, y: 0, k: 100}