Last active
October 27, 2017 21:08
-
-
Save josefnpat/7d57ef804e340d3eb29095cc0bb4139d to your computer and use it in GitHub Desktop.
RGB <=> HS[L|V]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c | |
--[[ | |
* Converts an RGB color value to HSL. Conversion formula | |
* adapted from http://en.wikipedia.org/wiki/HSL_color_space. | |
* Assumes r, g, and b are contained in the set [0, 255] and | |
* returns h, s, and l in the set [0, 1]. | |
* | |
* @param Number r The red color value | |
* @param Number g The green color value | |
* @param Number b The blue color value | |
* @return Array The HSL representation | |
]] | |
function rgbToHsl(r, g, b, a) | |
r, g, b = r / 255, g / 255, b / 255 | |
local max, min = math.max(r, g, b), math.min(r, g, b) | |
local h, s, l | |
l = (max + min) / 2 | |
if max == min then | |
h, s = 0, 0 -- achromatic | |
else | |
local d = max - min | |
local s | |
if l > 0.5 then s = d / (2 - max - min) else s = d / (max + min) end | |
if max == r then | |
h = (g - b) / d | |
if g < b then h = h + 6 end | |
elseif max == g then h = (b - r) / d + 2 | |
elseif max == b then h = (r - g) / d + 4 | |
end | |
h = h / 6 | |
end | |
return h, s, l, a or 255 | |
end | |
--[[ | |
* Converts an HSL color value to RGB. Conversion formula | |
* adapted from http://en.wikipedia.org/wiki/HSL_color_space. | |
* Assumes h, s, and l are contained in the set [0, 1] and | |
* returns r, g, and b in the set [0, 255]. | |
* | |
* @param Number h The hue | |
* @param Number s The saturation | |
* @param Number l The lightness | |
* @return Array The RGB representation | |
]] | |
function hslToRgb(h, s, l, a) | |
local r, g, b | |
if s == 0 then | |
r, g, b = l, l, l -- achromatic | |
else | |
function hue2rgb(p, q, t) | |
if t < 0 then t = t + 1 end | |
if t > 1 then t = t - 1 end | |
if t < 1/6 then return p + (q - p) * 6 * t end | |
if t < 1/2 then return q end | |
if t < 2/3 then return p + (q - p) * (2/3 - t) * 6 end | |
return p | |
end | |
local q | |
if l < 0.5 then q = l * (1 + s) else q = l + s - l * s end | |
local p = 2 * l - q | |
r = hue2rgb(p, q, h + 1/3) | |
g = hue2rgb(p, q, h) | |
b = hue2rgb(p, q, h - 1/3) | |
end | |
return r * 255, g * 255, b * 255, a * 255 | |
end | |
--[[ | |
* Converts an RGB color value to HSV. Conversion formula | |
* adapted from http://en.wikipedia.org/wiki/HSV_color_space. | |
* Assumes r, g, and b are contained in the set [0, 255] and | |
* returns h, s, and v in the set [0, 1]. | |
* | |
* @param Number r The red color value | |
* @param Number g The green color value | |
* @param Number b The blue color value | |
* @return Array The HSV representation | |
]] | |
function rgbToHsv(r, g, b, a) | |
r, g, b, a = r / 255, g / 255, b / 255, a / 255 | |
local max, min = math.max(r, g, b), math.min(r, g, b) | |
local h, s, v | |
v = max | |
local d = max - min | |
if max == 0 then s = 0 else s = d / max end | |
if max == min then | |
h = 0 -- achromatic | |
else | |
if max == r then | |
h = (g - b) / d | |
if g < b then h = h + 6 end | |
elseif max == g then h = (b - r) / d + 2 | |
elseif max == b then h = (r - g) / d + 4 | |
end | |
h = h / 6 | |
end | |
return h, s, v, a | |
end | |
--[[ | |
* Converts an HSV color value to RGB. Conversion formula | |
* adapted from http://en.wikipedia.org/wiki/HSV_color_space. | |
* Assumes h, s, and v are contained in the set [0, 1] and | |
* returns r, g, and b in the set [0, 255]. | |
* | |
* @param Number h The hue | |
* @param Number s The saturation | |
* @param Number v The value | |
* @return Array The RGB representation | |
]] | |
function hsvToRgb(h, s, v, a) | |
local r, g, b | |
local i = math.floor(h * 6); | |
local f = h * 6 - i; | |
local p = v * (1 - s); | |
local q = v * (1 - f * s); | |
local t = v * (1 - (1 - f) * s); | |
i = i % 6 | |
if i == 0 then r, g, b = v, t, p | |
elseif i == 1 then r, g, b = q, v, p | |
elseif i == 2 then r, g, b = p, v, t | |
elseif i == 3 then r, g, b = p, q, v | |
elseif i == 4 then r, g, b = t, p, v | |
elseif i == 5 then r, g, b = v, p, q | |
end | |
return r * 255, g * 255, b * 255, a * 255 | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Copyright 2011 Emmanuel Oga. | |
Licensed under a Creative Commons Attribution 3.0 | |
Unported License (http://creativecommons.org/licenses/by/3.0/). | |
You are free: | |
to Share — to copy, distribute and transmit the work | |
to Remix — to adapt the work | |
Under the following conditions: | |
Attribution — You must attribute the work in the manner specified by the author | |
or licensor (but not in any way that suggests that they endorse you or your use | |
of the work). | |
With the understanding that: | |
Waiver — Any of the above conditions can be waived if you get permission from | |
the copyright holder. | |
Public Domain — Where the work or any of its elements is in the public domain | |
under applicable law, that status is in no way affected by the license. | |
Other Rights — In no way are any of the following rights affected by the | |
license: | |
Your fair dealing or fair use rights, or other applicable copyright exceptions | |
and limitations; | |
The author's moral rights; | |
Rights other persons may have either in the work itself or in how the work is | |
used, such as publicity or privacy rights. | |
Notice — For any reuse or distribution, you must make clear to others the | |
license terms of this work. The best way to do this is with a link to this web | |
page. | |
This is a human-readable summary of the full license at http://creativecommons.org/licenses/by/3.0/legalcode |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment