FastLED 3.9.5
Loading...
Searching...
No Matches
HSV to RGB Conversion Functions

Detailed Description

Functions to convert from the HSV colorspace to the RGB colorspace.

These basically fall into two groups: spectra, and rainbows. pectra and rainbows are not the same thing. Wikipedia has a good llustration that shows a "spectrum" and a "rainbow" side by side:
Spectra and Rainbow comparison

Source: http://en.wikipedia.org/wiki/Rainbow#Number_of_colours_in_spectrum_or_rainbow

Among other differences, you'll see that a "rainbow" has much more yellow than a plain spectrum. "Classic" LED color washes are spectrum based, and usually show very little yellow.

Take a look Wikipedia's page on HSV color space, with pseudocode for conversion to RGB color space: http://en.wikipedia.org/wiki/HSL_and_HSV

Note that their conversion algorithm, which is (naturally) very popular is in the "maximum brightness at any given hue" style, vs. the "uniform brightness for all hues" style.

You can't have both; either purple is the same brightness as red, e.g:

red = 0xFF0000
purple = 0x800080

Where you have the same "total light" output. OR purple is "as bright as it can be", e.g.:

red = 0xFF0000
purple = 0xFF00FF

Where purple is much brighter than red.

The colorspace conversions here try to keep the apparent brightness constant even as the hue varies.

Adafruit's "Wheel" function, discussed here is also of the "constant apparent brightness" variety.

Todo
Provide the "maximum brightness no matter what" variation.
See also
Some good, clear Arduino C code from Kasper Kamperman, which in turn was based on Windows C code from "nico80"

Macros

#define HUE_MAX_RAINBOW   255
 Max hue accepted for the hsv2rgb_rainbow() function.
 
#define HUE_MAX_SPECTRUM   255
 Max hue accepted for the hsv2rgb_spectrum() function.
 
#define HUE_MAX   191
 Max hue accepted for the hsv2rgb_raw() function.
 

Functions

void hsv2rgb_rainbow (const struct CHSV *phsv, struct CRGB *prgb, int numLeds)
 Forward declaration of hsv2rgb_rainbow here, to avoid circular dependencies.
 
void hsv2rgb_spectrum (const struct CHSV &hsv, struct CRGB &rgb)
 Convert an HSV value to RGB using a mathematically straight spectrum.
 
CRGB hsv2rgb_spectrum (const struct CHSV &hsv)
 Inline version of hsv2rgb_spectrum which returns a CRGB object.
 
void hsv2rgb_spectrum (const struct CHSV *phsv, struct CRGB *prgb, int numLeds)
 Convert an HSV value to RGB using a mathematically straight spectrum.
 
void hsv2rgb_raw (const struct CHSV &hsv, struct CRGB &rgb)
 Convert an HSV value to RGB using a mathematically straight spectrum.
 
void hsv2rgb_raw (const struct CHSV *phsv, struct CRGB *prgb, int numLeds)
 Convert an HSV value to RGB using a mathematically straight spectrum.
 
CHSV rgb2hsv_approximate (const CRGB &rgb)
 Recover approximate HSV values from RGB.
 

Macro Definition Documentation

◆ HUE_MAX

#define HUE_MAX   191

Max hue accepted for the hsv2rgb_raw() function.

Definition at line 125 of file hsv2rgb.h.

◆ HUE_MAX_RAINBOW

#define HUE_MAX_RAINBOW   255

Max hue accepted for the hsv2rgb_rainbow() function.

Definition at line 73 of file hsv2rgb.h.

◆ HUE_MAX_SPECTRUM

#define HUE_MAX_SPECTRUM   255

Max hue accepted for the hsv2rgb_spectrum() function.

Definition at line 104 of file hsv2rgb.h.

Function Documentation

◆ hsv2rgb_rainbow()

void hsv2rgb_rainbow ( const struct CHSV * phsv,
struct CRGB * prgb,
int numLeds )

Forward declaration of hsv2rgb_rainbow here, to avoid circular dependencies.

See also
hsv2rgb_rainbow(const struct CHSV&, struct CRGB&)
Parameters
phsvCHSV array to convert to RGB. Max hue supported is HUE_MAX_RAINBOW
prgbCRGB array to store the result of the conversion (will be modified)
numLedsthe number of array values to process

Definition at line 479 of file hsv2rgb.cpp.

◆ hsv2rgb_raw() [1/2]

void hsv2rgb_raw ( const struct CHSV & hsv,
struct CRGB & rgb )

Convert an HSV value to RGB using a mathematically straight spectrum.

See also
hsv2rgb_spectrum(const struct CHSV&, struct CRGB&)
Note
The hue is limited to the range 0-191 (HUE_MAX). This results in a slightly faster conversion speed at the expense of color balance.
Parameters
hsvCHSV struct to convert to RGB. Max hue supported is HUE_MAX
rgbCRGB struct to store the result of the conversion (will be modified)

Definition at line 23 of file hsv2rgb.cpp.

◆ hsv2rgb_raw() [2/2]

void hsv2rgb_raw ( const struct CHSV * phsv,
struct CRGB * prgb,
int numLeds )

Convert an HSV value to RGB using a mathematically straight spectrum.

See also
hsv2rgb_raw(const struct CHSV&, struct CRGB&)
Parameters
phsvCHSV array to convert to RGB. Max hue supported is HUE_MAX
prgbCRGB array to store the result of the conversion (will be modified)
numLedsthe number of array values to process

Definition at line 473 of file hsv2rgb.cpp.

◆ hsv2rgb_spectrum() [1/3]

CRGB hsv2rgb_spectrum ( const struct CHSV & hsv)
inline

Inline version of hsv2rgb_spectrum which returns a CRGB object.

Definition at line 90 of file hsv2rgb.h.

◆ hsv2rgb_spectrum() [2/3]

void hsv2rgb_spectrum ( const struct CHSV & hsv,
struct CRGB & rgb )

Convert an HSV value to RGB using a mathematically straight spectrum.

This "spectrum" will have more green and blue than a "rainbow", and less yellow and orange.

FastLED 'Spectrum' Hue Chart

Note
This function wraps hsv2rgb_raw() and rescales the hue value to fit the smaller range.
Parameters
hsvCHSV struct to convert to RGB. Max hue supported is HUE_MAX_SPECTRUM
rgbCRGB struct to store the result of the conversion (will be modified)

Definition at line 226 of file hsv2rgb.cpp.

◆ hsv2rgb_spectrum() [3/3]

void hsv2rgb_spectrum ( const struct CHSV * phsv,
struct CRGB * prgb,
int numLeds )

Convert an HSV value to RGB using a mathematically straight spectrum.

See also
hsv2rgb_spectrum(const struct CHSV&, struct CRGB&)
Parameters
phsvCHSV array to convert to RGB. Max hue supported is HUE_MAX_SPECTRUM
prgbCRGB array to store the result of the conversion (will be modified)
numLedsthe number of array values to process

Definition at line 485 of file hsv2rgb.cpp.

◆ rgb2hsv_approximate()

CHSV rgb2hsv_approximate ( const CRGB & rgb)

Recover approximate HSV values from RGB.

These values are approximate, not exact. Why is this "only" an approximation? Because not all RGB colors have HSV equivalents! For example, there is no HSV value that will ever convert to RGB(255,255,0) using the code provided in this library. So if you try to convert RGB(255,255,0) "back" to HSV, you'll necessarily get only an approximation. Emphasis has been placed on getting the "hue" as close as usefully possible, but even that's a bit of a challenge. The 8-bit HSV and 8-bit RGB color spaces are not a "bijection".

Nevertheless, this function does a pretty good job, particularly at recovering the 'hue' from fully saturated RGB colors that originally came from HSV rainbow colors. So if you start with CHSV(hue_in,255,255), and convert that to RGB, and then convert it back to HSV using this function, the resulting output hue will either exactly the same, or very close (+/-1). The more desaturated the original RGB color is, the rougher the approximation, and the less accurate the results.

Note
This function is a long-term work in progress; expect results to change slightly over time as this function is refined and improved.
Note
This function is most accurate when the input is an RGB color that came from a fully-saturated HSV color to start with. E.g. CHSV( hue, 255, 255) -> CRGB -> CHSV will give best results.
Note
This function is not nearly as fast as HSV-to-RGB. It is provided for those situations when the need for this function cannot be avoided, or when extremely high performance is not needed.
See also
https://en.wikipedia.org/wiki/Bijection
Parameters
rgban RGB value to convert
Returns
the approximate HSV equivalent of the RGB value

Definition at line 498 of file hsv2rgb.cpp.