Decolmor
Gem for converting color spaces from/to: HEX/RGB/HSL/HSV/HSB/HSI/CMYK
The Alpha channel (transparency) is supported.
There is also a simple RGB generator.
News . Recent releases . Changelog . Wiki
Install
Add the following line to Gemfile:
gem 'decolmor'
and run bundle install
from your shell.
To install the gem manually from your shell, run:
gem install decolmor
Supported Rubies
- 2.4
- 2.5
- 2.6
- 2.7
- 3.0
Using
require 'decolmor'
rgb = [29, 128, 86]
Decolmor.rgb_to_hsb(rgb)
=> [154.5, 77.3, 50.2]
or include
into class:
class SomeClass
include Decolmor
end
SomeClass.rgb_to_hsb(rgb)
=> [154.5, 77.3, 50.2]
Gem methods will be available as class methods.
See WIKI for more examples.
Rounding for HSL/HSV/HSB/HSI/CMYK
By default, rounding 1 is used to convert to HSL/HSV/HSB/HSI/CMYK.
This is enough to loselessly convert RGB -> HSL/HSV/HSB/HSI/CMYK -> RGB:
- for HSI this is not quite true ~2k (of 16.6M) RGB colors will be slightly different, rounding 2 fixes this.
rgb = [224, 23, 131]
hsl = Decolmor.rgb_to_hsl(rgb) # => [327.8, 81.4, 48.4]
hsv = Decolmor.rgb_to_hsv(rgb) # => [327.8, 89.7, 87.8]
Decolmor.hsv_to_rgb(hsv) # => [224, 23, 131]
Decolmor.hsl_to_rgb(hsl) # => [224, 23, 131]
If you convert between HSL <==> HSV (HSB) with a rounding of 2, you can get more accurate results.
This can also be useful if you use HSL/HSB for intermediate changes and then go back to RGB.
You can change rounding globally:
Decolmor.hsx_round = 2
Decolmor.rgb_to_hsl(rgb) # => [154.55, 63.06, 30.78]
Decolmor.hsx_round # => 2
You can also specify rounding as a second argument when calling the method:
Decolmor.rgb_to_hsl(rgb, 3) # => [154.545, 63.057, 30.784]
In this case, the global rounding will be ignored. If you need to get integers, use 0.
HEX to
- with & without prefix
#
- short HEX are supported (including Alpha)
- can be set rounding for the Alpha channel
Alpha channel
When converting from HEX to RGBA Alpha channel is converted to a value from the range 0..1
with rounding 3:
- 3 digits is enough for a lossless conversion
0..255
->0..1
->0..255
Decolmor.hex_to_rgb('#19988BB8') # => [25, 152, 139, 0.722]
Decolmor.hex_to_rgb([25, 152, 139, 0.722) # => "#19988BB8"
Consequently, when converting to HEX from RGBA, Alpha from the range 0..1
is assumed.
But you can set range 0..255 for alpha channel:
Decolmor.hex_to_rgb('#19988BB8', alpha_255: true) # => [25, 152, 139, 184]
Decolmor.rgb_to_hex([25, 152, 139, 184], alpha_255: true) # => "#19988BB8"
You can also set rounding for Alpha channel as a second argument:
Decolmor.hex_to_rgb('#19988BB8', 2) # => [25, 152, 139, 0.72]
This only works for converting from HEX.
In other cases (conversions between RGB/HSL/HSV/HSB/HSI/CMYK) Alpha channel remains unchanged.
HSL, HSI, HSV or HSB
HSL, HSI, HSV - are three different color spaces.
They have only one common parameter HUE.
S - Suturation, despite the same name, is different in all three spaces,
like the last component: Lightness / Intensity / Value (Brightness).
HSB is an alternative name for HSV, it is the same thing.
However, for convenience, aliasing methods are made for HSB from HSV.
rgb = [255, 109, 55]
Decolmor.rgb_to_hsv(rgb) # => [16.2, 78.4, 100.0]
Decolmor.rgb_to_hsb(rgb) # => [16.2, 78.4, 100.0]
HSL/HSV/HSB to RGB conversion
HSL/HSV/HSB to RGB conversion has two implementations, the gem includes both:
- hsl_to_rgb
- hsv_to_rgb
- hsb_to_rgb
or
- hsl_to_rgb_alt
- hsv_to_rgb_alt
- hsb_to_rgb_alt
The results of the two implementations are identical, but the alternative versions (postfix _alt
) are slightly slower.
Attention for CMYK !
Unfortunately, there is no simple formula for linear RGB to/from CMYK conversion.
This implementation is a simplified/dirty/simulation.
CMYK is used for printing and the correct conversion will be non-linear, based on the color profile for the particular printing device.
Therefore, the CMYK conversion results will not match Adobe products.
BUT:
Conversion from/to HEX/RGB/HSL/HSV/HSB/HSI is simple and is described by formulas.
Read more: https://en.wikipedia.org/wiki/HSL_and_HSV
The results when rounded to an integer will be the same as when using graphics editors, such as CorelDRAW or Adobe Photoshop.
Supported Methods
- Setter global rounding for conversion to HSL/HSV/HSB/CMYK
- hsx_round =
- HEX <==> RGB(A)
- hex_to_rgb
- rgb_to_hex
- Simple generator RGB, you can set any channel(s)
- new_rgb
- RGB(A) to HSL/HSV/HSB/HSI
- rgb_to_hsl
- rgb_to_hsv
- rgb_to_hsb
- rgb_to_hsi
- HSL/HSV/HSB/HSI to RGB(A)
- hsl_to_rgb
- hsv_to_rgb
- hsb_to_rgb
- hsi_to_rgb
- Alternative implementation HSL/HSV/HSB to RGB(A) (a little slower)
- hsl_to_rgb_alt
- hsv_to_rgb_alt
- hsb_to_rgb_alt
- HSL <==> HSV (HSB)
- hsl_to_hsv
- hsl_to_hsb
- hsv_to_hsl
- hsb_to_hsl
- RGB(A) <==> CMYK
- rgb_to_cmyk
- cmyk_to_rgb
- HEX => HSL/HSV/HSB/HSI/CMYK
- hex_to_hsl
- hex_to_hsv
- hex_to_hsb
- hex_to_hsi
- hex_to_cmyk
- HSL/HSV/HSB/HSI/CMYK => HEX
- hsl_to_hex
- hsv_to_hex
- hsb_to_hex
- hsi_to_hex
- cmyk_to_hex
License
MIT License
Copyright (c) 2021 ChildrenofkoRn
LICENSE